一:嵌入式概述?
1.什么是嵌入式:
a.嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统; b.国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能,可靠性,成本,体积,功耗等严格要求的专用计算机系统; c.从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械的附属装置。
事实上,所有带有数字接口的设备,如手表,微波炉,录像机,汽车,机器人等,都使用嵌入式系统,有些嵌入式系统还包含操作系统
2.嵌入式芯片选型:
单片机能搞定的 1.共享单车的锁 单片机GPS定位模块 NB-IOT模块发送定位消息 蓝牙 电磁锁
2.宿舍楼下刷卡开铁门 单片机,读卡器,电磁锁
3.快递小哥扫快递二维码 单片机,屏幕,二维码技术
4.共享汽车开锁 GSM通信模块,电磁锁(基于汽车锁改造)
低端单片机搞不定的,用ARM架构,比如STM32,比如ARM+LINUX+QT,比如安卓系统 1.人脸识别 比如C51的摄像头,清晰度低,算法慢, 准确度低
2.带人机交互的 C51,STM32配合屏幕,UI自定义底层UI风格体验差,开发量大 QT方案:通常基于Linux,STM32跑不了Linux,所以用nanopi,树莓派,2440等 安卓的方案:基于安卓,高通的,华为海思等
3.什么是ARM: 公司名字: 英国ARM公司(ARM公司总部设立在上海,执行中国地区所有的产品业务和售后支持。其中在深圳办事处,专门处理ARM相关技术问题。)
硬件架构的一种: ARM架构(STM32,高通,骁龙,海思,树莓派的Cortex-A53d等) Intel架构(AMD) MIPS架构 powerPC架构
二:树莓派开发笔记
1.树莓派刷机: 2.树莓派登录: 2.1 HDMI 视频线 连接到显示器
2.2 串口 2.2.1 设备破解 默认情况,树莓派的串口和蓝牙连接。 想办法断开蓝牙连接,把串口用来数据通信 a.观看树莓派的启动过程,字符
b.修改系统配置,串口登入树莓派 1.打开SD卡根目录的"config.txt"这个文件,将以下内容添加在最后一行并且保存
dtoverlay=pi3-miniuart-bt
这段代码用于停止了蓝牙,解除了对串口的占用。
2.然后再打开SD卡根目录的"cmdline.txt",将里面的内容全部替换成以下内容
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
2.2.2 默认账号:pi 默认密码:raspberry
2.3 通过网络登入树莓派 2.3.1 让树莓派入网 修改
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
nano是文档编辑器,已进入便可以编写。 Ctrl+o保存,会有提示是否写入。我们按回车,Ctrl+x退出 sudo reboot 重启树莓派 sudo shutdown -h now 关机树莓派
2.3.2 固定树莓派IP地址
sudo nano /etc/rc.local
2.4 图形方式登入树莓派 2.4.1 首先在树莓派在终端用指令下载一个开源软件xrdp(远程桌面)
sudo apt-get install xrdp
2.4.2 下载好之后在pc机上用远程桌面登入树莓派
3.VIM更新到好用的版本 3.1 默认的源是国外的,apt-get 安装的时候失败,我们更新成国内的源 3.2 先使用命令编辑sources.list文件
sudo nano /etc/apt/sources.list
把之前的源用#键注释掉,然后使用下面的源贴进来
deb http:
更新源
sudo apt-get update
安装新版VIM
sudo apt-get install vim
4.树莓派和windows的File Zilla文件共享 拖拽的方式实现双方的传输。强调的是IP地址前面要加sftp,以免传输过程中丢失数据
三:Linux库引入之分文件编程
1.分文件编程: 好处: 分模块编程的思想 比如在工作中,一个大项目: 网络 A同学做 超声波 B同学做 点击 C同学做
对公司而言可以大大提高效率: a.功能责任划分 b.方便调试 c.主程序简洁
2.来段简单代码演示下: 主函数文件代码
#include<stdio.h>
#include"text.h"
int main()
{
printf("xiaopapa handsome!\n");
papa();
return 0;
}
调用函数文件代码:
#include<stdio.h>
void papa()
{
printf("yes i think so!\n");
}
主函数需要包含调用函数的函数名的文件名,所以文件名是: 文件名是text.h
void papa();
运行结果:
两个文件一起编译,然后形成一个可执行程序 注:include<stdio.h> <>是指当你gcc编译一个文件的时候默认情况下,会自动帮你去 /usr/include下找到stdio.h的文件。“ ” 是指会在当前目录下去找 text.h的文件,找不到会去include下去找,找不到就报错
四:Linux库引入之动态库和静态库
1.库的介绍 一个“程序函数库”简单来说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可以分为3种类型:静态函数库(static libraries),共享函数库(shared libraries),动态加载函数库(dynamically loaded libraries): 1.静态函数库,是在程序执行前(编译)就加入到目标程序中去了;
优点: 1.静态库被打包到应用程序中,加载速度快 2.发布程序无需提供静态库,因为已经在APP中,移植方便 缺点: 1.链接是完整的拷贝至可执行文件中,多次使用就有多份冗余拷贝 2.更新,部署,发布麻烦
2.动态函数库,是在程序执行时动态(临时)由目标程序去调用;
优点: 1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存 2.程序升级简单,因为APP里面没用库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功 缺点: 1.加载速度比静态库慢 2.发布程序需要提供依赖的动态库
五:静态库的生成和使用
1.静态库的制作 格式 xxxx.a 第一步:gcc demo2.c -c 生成 demo2.o 文件 第二部:ar rcs libdemo2.a demo2.o 生成 libdemo2.a 的静态文件库
2.库的使用
编译 gcc demo1.c -l demo2 -L ./ -o mainProStatic 生成mianProStatic可执行文件 -l demo2中的 -l 是制定要用的静态库,库名砍头去尾 -L 则是告诉gcc编译器从-L指定的路径去找静态库。默认是从 /usr/lib 或者 /usr/local/lib 去找
3.下面请看示例:
六:动态库的生成和使用
1.动态库的制作: gcc -shared -fpic demo2.c -o libdemo2.so -shared 指生成动态库 -fpic 指在生成目标文件时就得使用该选项,以生成位置无关的代码
2.动态库的使用: gcc demo1.c -ldemo2 -L ./ -o mainProDy
3.引用动态库,怎么指定动态库的位置: 带动态库的程序,可以指定该程序运行的时候,在 LD_LIBRARY_PATH 所指定的路径去找库文件 例如:export LD_LIBRARY_PATH=“/home/pi/Text” 相当于在此路径配置了环境变量,该路径下的目标程序的动态库可以被等到执行。
但是该路径设置的环境变量只能在该终端窗口运行,所以我们可以在该路径下写个shell脚本,让他另外开一个终端窗口也可运行: 例如我创建一个文件:touch text2
export LD_LIBRARY_PATH="/home/pi/Text"
./mainProDy
然后我们在终端上给该文件赋予可执行权限:chmod +x text2 这样我们就可以直接运行该 text2 文件了,./text2 相当于运行了 ./mainProDy 程序。
|