嵌入式编程语言
- 主要使用C语言,中间层开发用C++多一些,应用层C++、Java、python、tcl/tk、perl等
嵌入式系统特点
- 专用、软硬件可裁剪可配置
- 低功耗、高可靠性、高稳定性
- 软件代码短小精悍
- 代码可固化
- 实时性
- 弱交互性
- 专用开发工具及开发环境
嵌入式系统组成
硬件
- 微处理器
- 存储器
- I/O接口、输入输出设备等
软件
- 底层 嵌入式操作系统
- 底层 BSP 板级支持包
- 上层 应用软件
为何使用交叉编译
- 嵌入式开发的cpu比较简单,本身无法搭建开发环境,有些甚至都没有操作系统
- 交叉编译可以用高性能机器为低性能机器开发软件(包括裸机软件、系统级和应用级软件)
地址总线和数据总线
-
地址总线用以寻址,只传输地址;数据总线与外部设备交换信息。
-
地址总线的位数决定寻址范围,数据总线的位数决定单次通信能交换的信息量。
-
总线的速度决定CPU和外设互换信息的速度、
-
CPU的位数表示数据总线的位数
-
嵌入式系统需要bootloader来启动,而bootloader必须首先存在于可启动介质,需要专用工具。
-
Jlink 下载可执行程序到目标机,在目标机上实现单步调试,便于开发bootloader
- 从源代码到CPU执行过程 *
CISC复杂指令集CPU,设计理念:用最少得指令来完成任务。比如英特尔X86系列:AMD
缺点:CPU设计复杂,功耗大
CPU
- CISC年代——CPU的功能扩展依赖于指令集的扩展,实质是~内部组合逻辑电路的扩展;
- RISC——~仅提供基础功能指令(譬如内存与寄存器通信指令,基本运算与判断指令等),功能扩展由使用CPU的人利用基础架构来灵活实现。
IO一般指 与CPU连接的各种外设
CPU访问外设的2种方式:一种是类似于访问内存的方式,即把外设的寄存器当作一个内存地址来读写,从而以访问内存相同的方式来操作外设,叫IO与内存统一编址方式;另一种是使用专用的CPU指令来访问某种特定外设,叫IO与内存独立编址。
- 冯诺依曼结构——程序和数据都放在内存中,如Intel的CPU
- 哈佛结构——程序和数据分开独立放在不同内存块种,彼此完全分离,如大部分单片机
SRAM DRAM
-
SRAM 静态内存 容量小、价格高;不需要软件初始化直接上电就能用;
-
DRAM 动态内存 容量大、价格低;需要软件初始化
-
单片机:内存需求量小,而且希望开发尽可能简单,适合全部用SRAM
-
嵌入式系统:内存需求量大,可能没有NorFlash等可启动介质
-
PC机:内存需求量大,而且软件复杂,不在乎DRAM初始化开销,适合全部用DRAM
外存:
- NorFlash:容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可直接读取,所以一般用作启动介质
- NandFlash:(跟硬盘一样):容量大,价格低,缺点即上面优点,需要CPU先运行一些初始化软件,然后通过时序接口读写
ARM处理器工作模式
为什么设计这些模式
- cpu是硬件,OS是软件,软件的设计依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性;
- 操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。
CPSR程序状态寄存器
同步
异步 靠中断(一种特殊的异常)
(汇编)伪指令本质上不是指令,它是编译器环境提供的,目的是用来指导编译过程,经编译后伪指令最终不会生成机器码。
- 为增加处理器指令流的速度,ARM使用多级流水线
四种栈
空栈 满栈
增栈 减栈
Makefile
管理工程
在一个正式的软件项目中,有很多个.c .h文件构成,如果直接在命令行编译,就会:gcc a.c b.c c.c… -o exe很麻烦
目标:顶格写,后面是冒号(冒号后面是依赖)
依赖:用来产生目标的原材料
命令:前面一定是Tab,不能是定格,也不能是多个空格。命令就是要生成那个目标需要做的动作
GPIO
general purpose input output,GPIO就是芯片的引脚(芯片上的引脚只有一部分是GPIO),作为GPIO的这类引脚,它的功能和特性是可以被编程控制工作模式、电压高低等。
看门狗
现实中因为一些外部因素(极端恶劣的环境等),电子设备经常会跑飞或者死机。在这种情况下,我们希望设备自动复位而不需要人工干预(无人值守)。看门狗用来完成这个工作,它其实是SOC内部的一个定时器,定好时间后看门狗定时器回去计时,时间到之前(狗饿了之前),必须重新置位看门狗定时器(喂狗),如果没有喂狗系统则会被强制复位。
系统正常工作时,系统软件会自己去喂狗,所以看门狗定时器不会复位。但是系统一旦故障跑飞啥的,没喂狗,下一个周期就会自动复位,打到我们预期的效果。
- 为何关看门狗?
一般CPU设计,在CPU启动后看门狗是默认工作的(可能是因为启动代码前就死机了或者跑飞了没人管),好处是没有空挡和漏洞,坏处是启动代码段我们不方便喂狗(或者懒得喂狗)时看门狗会复位,所以为了偷懒我们在启动代码前段先关闭看门狗,然后在后面系统启动起来之后再根据需要决定是否要打开看门狗(一旦打开就必须同时提供喂狗)