嵌入式复习
第一章
-
基本概念
以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、重量和功耗严格要求的专用计算机系统。
-
体系结构:四层。应用层、系统层、中间层和硬件层
- 处理器:嵌入式微处理器、微控制器、数字信号处理器,SoC——FPGA(快速成品、可以修正、便宜)、ASIC
- 操作系统:IOS,Android,Linux,WinCE
第二章
设计方法
-
传统方法
优点是简单易行,分工明确。缺点是排错困难,无法进行全系统的优化设计
-
软硬件结合
优点是软硬件统一描述有利于优化设计,着重算法。缺点是不够成熟,缺少高效开发工具。
第三章
-
ARM是低功耗成本的第一款RISC微处理器。
-
ARM7 冯诺依曼结构,三级流水结构,极低的功耗。移动终端之类的,已经落后了。
ARM9 哈佛结构,五级流水结构,执行效率更高。无线设备,机顶盒,高端打印机、数字照相机摄像机,车载车控。
-
ARM版本
v1-v3是开发和试验版本,功能单一。v4是第一个具有全部正式定义的体系结构,ARM从v4版本开始走向成熟。v5是对v4的扩展。v6强化了图形处理,支持多种版本内核。v7是ARM的极大成功,占据了70%的市场,领先地位。
-
体系结构
冯诺依曼结构是常规的,指令存储器和数据存储器在一起的存储器结构,程序指令和数据的宽度相同
哈佛结构是程序指令存储和数据存储分开的存储结构
-
流水线技术
- 三级流水是指取指、译码、执行三级。
- 五级流水是指取指、译码、执行、存储器访问、寄存器回写五级。
-
多核大小核
多核要关注的两个问题,一是在多任务执行的时候要能够很好的提升产品性能,二是提高电池续航
第一代大小核应该是A57+A53,第二代大小核A75+A55,DynamlQ big.LITTLE
-
处理器模式
用户模式、系统模式、快速中断、外部中断、管理模式、数据访问终止、未定义指令中止。
除开用户模式意外都是特权模式,除开用户和系统意外都是异常模式。
-
处理器工作模式有两种,ARM(字对齐,32位ARM指令)和Thumb(半字对齐,16位Thumb指令),开始执行代码时总是处于ARM状态。
模式切换:
- 执行BX命令,带状态切换的指令,操作数寄存器最低位[0]为1时进入Thumb。
- 工作在Thumb状态,遇到异常进入异常状态,处理完返回时进入Thumb状态。
进入ARM
- 执行BX命令,最低位[0]为0,进入ARM。
- 工作在Thumb状态,发生异常进入异常处理,进入ARM状态。
-
寄存器
-
未分组寄存器:R0-R7,指向同一个物理寄存器。
-
分组寄存器:R8-R14,根据不同处理器模式分组。对应物理寄存器由当前处理器模式决定。
-
R0–R13通用寄存器,不用做特殊用途。
-
R8–R12有两个分组的物理寄存器,一个用于FIQ模式,另一个用于其他模式。
-
R13-R14有六个分组。一个分组用于系统模式和用户模式,剩下五个分别为各自的异常模式。
-
R13也堆栈指针,SP。ARM无特殊指令。
-
R14 链接寄存器 LR
- 模式自身的R14用于保存子程序返回地址
- 异常时,对应的异常版本R14设置为异常返回地址。
-
R15 程序计数器PC
ARM [1:0]为0 [31:2]保存PC
Thumb [0]为0,[31:1]保存PC
-
R16
- CPSR 程序状态寄存器 任何模式均可访问,包括条件标志位,中断禁止位等。
- SPSR 程序状态保存寄存器
进入异常时。SPSR保存CPSR寄存器的值,异常返回后写回。
-
-
异常(程序的正常执行流程遇到暂时的停止):
- 复位:处理器复位电平有效时,产生复位异常
- 未定义
- 软件中断
- 指令预取中止
- 数据中止
- IRQ(外部中断请求):外部中断请求引脚有效,且CPSR的I位为0,产生IRQ异常,优先级低于FIQ。
- FIQ(快速中断请求)
-
异常流程
- CPSR复制到对应异常的SPSR
- 设置对应异常的CPSR
- 下一条指令地址存入R14
- 强制PC从相关的异常向量取指令执行,从而跳转到相应的异常处理
-
从异常返回
- SPSR的值复制回CPSR
- LR的值减去相应偏移量送回PC
复位异常不用返回。
-
ARM处理器的数据类型一般是三种,字、半字、字节,分别是32位、16位、8位。ARM要求自然对界,字需要四字节对齐,地址的低两位位0;半字则是二字节对齐,地址最低位0;字节可以任意地址对齐。
-
如果一个数据地址是从偶地址开始的连续存储,则是半字对齐,否则就是非半字;如果一个数据地址是从能被4整除的地址开始的连续存储,则是字对齐,否则就是非字对齐。
-
32位微处理器,支持最大寻址为4GB。从0开始的以字节为单位的线性组合,一个字四个位置。大端低地址存放高字节,高地址存放低字节,小段格式相反
-
ARM内核属于RISC结构,指令长度固定,指令格式种类少,寻址简单。
-
寻址方式
-
立即寻址:操作数指令中给出
-
寄存器寻址:操作数是给出寄存器的内容
-
寄存器间接寻址:寄存器的内容作为操作数的地址
-
基址变址寻址:寄存器的内容+偏移量为操作数地址
-
多寄存器寻址:一次传送多个寄存器的值
多寄存器加载/存储指令有8种模式,针对数据传送操作的有IA IB DA DB。针对堆栈操作的有FD ED FA EA
LDM 读出
STM 读入
LDR 读入
STR 读出
-
堆栈寻址:
-
移位寻址:
-
-
指令
- LDR 从存储器中将一个32位的数据放入目的寄存器
- LDRB 传送八位的字节数据,并清空高24位
- LDRH 传送16位的半字数据,并清空高16位
- STR 从源寄存器中将32位的子数据传送到存储器中。
- STRB 8位字节数据,源寄存器的低8位。
- STRH 半字数据,源寄存器低16位
分支
- B 跳转
- BL 跳转,跳转前保存当前PC内容到R14
数据处理
- MOV 数据加载 可以将另一个寄存器、被移位的寄存器、立即数加载到目的寄存器。
- MVN 同上,但是按位取反
- CMP 比较寄存器和寄存器或者寄存器和立即数的大小,更新CPSR某些标志位
- TST 按位与运算 检测是否设置了特定位数 寄存器,寄存器/立即数
- TEQ 按位异或运算, 检测两数是否相等
- ADD 两数相加 目的寄存器在前面。
- ADC c是CPSR的C条件标志位的值,三者相加
- SUB 减法操作,操作数1-操作数2。操作数一是寄存器,操作数二什么都可以
- SBC 同ADC
- AND 两个操作数按位与运算 屏蔽操作数1的某些位
- ORR 两个操作数逻辑或 (寄存器 寄存器/立即数 ),常用于设置操作数一的特定位置。
- EOR 逻辑异或运算, 基本同上,反转某些位。
乘法
- MUL 目的寄存器 操作数1 操作数2
状态寄存器访问指令
- MRS 通用寄存器 程序状态寄存器:将程序状态寄存器内容送出
- MSR 对程序状态寄存器进行写入操作。只有这个操作能修改程序状态寄存器、
- LDR 从存储器中将一个32位的数据放入目的寄存器
-
命名规则
ARM {X}{Y}{Z}{T}{D}{M}{I}{E}{J}{F}{S}
x:系列号
y:内部存储/保护单元,一般跟着序列号
T: 支持16位Thumb指令
D:支持JTAG片上调试
M:支持长乘法的ARM指令
I:支持断点和观察点的硬件调试
J:JAVA加速器Jazelle
F:向量浮点单元
S:可综合版本
-
实验代码指令略
第四章
-
伪指令
- .extern 标号在其他源文件定义,该文件可能引用
- .global 声明外部标号,本文将定义,其他文件可能引用。.
- .equ 定义常量的值
- .section 定义段
- _start是默认的入口点标号
-
LDR 实现将一个32位常数或者地址值加载到寄存器
-
ATPCS概述
-
子程序调用过程中寄存器的使用规则
- R0~R3:用于传参,R0用于返回值。
- R4~R11:通用变量寄存器。
- R12:用作过程调用中间临时过渡寄存器IP
- R13:堆栈指针
- R14:连接寄存器
- R15:PC
- R9: 静态基址寄存器SB
- R10:数据栈限制指针SL
- R11:帧指针FP
- 子程序通过寄存器R0~R3来传递参数
- R4~R11来保存局部变量,Thumb程序中只能使用4-7
- 寄存器R12用作子程序将临时过渡寄存器,记作IP
- 子程序R13不能用于其他作用,只能用于数据栈指针
- R14记作LR,用于保存子程序返回地址
- R15程序计数器PC,不能用于其他用途
- 各寄存器在编译器和汇编器中都是预定义的
-
数据栈的使用规则
-
参数的传递规则
- 参数不超过四个,R0R3。超过四个,依次排列使用R0R3
- 返回时32位使用R0,64位使用R0-R1。
-
第五章
-
金字塔结构。
寄存器-高速缓存(L1-L3)-主存-本地二级存储-远程二级存储
-
FLASH
优点
- 存储容量大
- 读取速度快
- 成本低
- 保护机制
缺点
- 先擦除后写入
- 擦写速度慢
- 必须以BLOCK方式写入
-
NOR Flash 英特尔所发展的架构
- 随机读取,读取速度快,写入和擦除速度较低,
- 应用程序可以直接在Flash内运行。
-
NAND Flash 东芝所发展的架构
- 读取比上面慢,写入擦除比上面快
- 相同密度下 成本低
- 适用与大容量存储装置
-
IROM 64KB 0xD0000000到0xD000FFFF
IRAM 96KB 0xD0020000到0xD0037FFF
-
S5PV210启动流程
- 通电以后从IROM处执行固化启动代码BL0
- BL0初始化过程中对设备进行判断。过程中从启动设备拷贝BL1到IRAM处。校验BL1内容,通过后执行,然后拷贝BL2到IRAM,校验通过后执行
- BL2完成复杂的初始化内容,完成后拷贝OS代码到DRAM并执行。
-
BL0启动代码
- 关闭看门狗
- 初始化icache
- 初始化栈和对
- 初始化块设备拷贝功能
- 设置时钟
- 拷贝BL1
- 校验BL1
第六章
-
GPIO 通用I/O接口
可编程的输入输出或者双向通信功能
控制146个GPIO中断
控制32个外部中断
237个多功能I/O端口
-
定时器
五个定时器(32位) 每一个都能产生中断请求。定时器0 1 2 3具有脉冲宽度调制,PWM,可以驱动1个外部I/O。定时器4是一个内部定时器,没有输出口线,定时器0具有死区发生器特性,适合大电流设备应用。
减一计数,到0为止。
- 双缓冲技术,有两组寄存器
- TCNTBn、TCMPBn 初值寄存器
- TCNTn、TCMPn 当前寄存器
- 定时器都有一个定时器时钟驱动的32位递减计数器。初值由TCNTBn设定
- TCMPBn的值用于PWM(脉冲宽度调制)
- 当TCNTn递减计数器的值和TCMPn相等时,定时器控制单元改变输出电平,决定占空比。
- 自动重装指定时器计数到0时的操作,初值寄存器的值会自动加载到当前寄存器。
-
UART 通用异步收发器,使用方便,编程简单,成本低廉。所有的微控制器都提供串行通讯接口。
工作原理
- 协议规定 空闲位、停止位为高电平,起始位为低电平。
- 数据发送:首先发送起始位,然后数据位。数据位按照规定的发送波特率先低后高诸位移出。最后发送停止位。
- 接收过程
- 异步通信需要高倍频的采样时钟,一般接收方采样时钟为接收波特率的16倍
- 连续采样8次都是低电平,确认接收起始位
- 然后每次间隔16个采样时钟接收一次数据位
- 接收奇偶校验位和停止位,同数据位方式。
- 停止位接收完毕进入空闲。
UART提供四个独立的异步的串行I/O口。每个UART包含 一个波特率发生器、一个发送器、一个接收器和一个控制部件。
- 操作步骤
- 设置涉及到引脚为UART功能
- 设置波特率、传送格式
- UART通道的工作模式
- 等待发送/接收数据完成