嵌入式复习总结
(图片转存失败的请查看资源)
第一章(不考)
第二章
2.1 RISC机特点总结
ARM中的R就代表是RISC机,RISC的特点:
1.从指令角度来看
1)指令系统中仅使用频率最高的一些简单指令,比如转移类指令只有一个B指令
2)指令长度固定,指令格式种类少,寻址方式种类少;(固定+规整)
3)只有取数LDR/存数STR两条指令可以访问存储器,其余指令的操作都在寄存器内完成;
2.从流水线角度来看
采用流水线技术以及超标量和超流水线技术,使得大部分指令在一个时钟周期内完成(这里的流水线指的是指令流水线,浮点流水线没有涉及到;此外,ARM采用哈佛结构使流水线发挥最大性能)
3.从通用寄存器角度来看
CPU中设计了多个通用寄存器,共37个(X86只有4到8个)
4-.控制器采用组合逻辑控制
5-.采用编译优化程序
2.2 两个指令集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GTZLIWI7-1683103825604)(img/image-20230430101605063.png)]
1.为什么要设计两个指令集?
正常情况下使用32位,如果采用16位指令,可以缩短代码长度,提高代码密度,减少内存的使用率。
2.需要解决的问题以及解决思路
1)写汇编指令时怎么告诉汇编器哪些要汇编成32位,哪些要汇编成16位
如果希望某段代码汇编成32位,前面加一个CODE32
如果希望汇编成16位,前面加一个CODE16(本质是使用BX指令修改程序状态寄存器CPSR中的Thumb位)
2)控制器如何正确取指令
设置两种操作状态,ARM态(32)和Thumb态(16),两种状态的切换是通过CODE32/16来切换
3)执行指令的时候控制器已经知道是32位或者16位,但是两种指令的编码格式都不一样,如何正确执行
因为16位指令和32位指令一一对应,所以使用一个解码器将16位指令装换成32位,所以在真正执行的时候都是32位
2.3 哈佛结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HftiOUXl-1683103829093)(null)]
哈佛结构是指主存有两个或者主存一个但有两个Cache(ARM采用,一个专门放数据,一个专门放指令,这样流水线在执行过程中不会有太多资源相关问题),哈佛结构的目的是为了让数据和指令分开,配合流水线让流水线发挥最大的性能。
指令在不同阶段都要进行访问,多条指令如果在流水线里面同时访问,一个存储器很难实现同时访问,那么流水线的速度就会下降。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vb1FRKYe-1683103825605)(img/image-20230430103046590.png)]
2.4 7种工作模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Op6MvE0W-1683103825606)(img/image-20230430103637357.png)]
1.为什么要设置7种模式?
分配寄存器,各个模式下相互之间不要相互干扰,当出现某种异常就自动的进入相应模式,每种模式下使用自己的寄存器和堆栈,这样的话可以减少保护现场恢复现场等操作的次数。
2.7种模式的切换
上电进入管理模式,进行初始化操作,然后进入用户态。出现某种异常就去相应的模式下处理,处理完再回到用户模式。
3.切换方法
修改CPSR寄存器相关位
4.几个重要寄存器的作用
R0 - R7 所有状态共用 8
R8 - R12 做了两组,一组专门为快中断用,其他的模式共用另一组 5 * 2
R13 - R14 system和user模式共用一组,其他五组各分配两个 2* 6 -- 每个模式都在内存中有各自的堆栈
R13(SP)栈顶指针
R14(LR)链接寄存器
断点保存在R14中,PC-->R14
R15 (PC) 只有一个 1
CPSR状态寄存器 只有一个,大家共用 1
SPSR每种状态1个 5 用户和系统模式没有
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yLOdU5PL-1683103829062)(null)]
2.5 异常
此处主要关注微处理器响应中断的时候要做什么事,至于中断请求和中断判优等操作在第六章中详细分析
1.CPU响应中断的流程
***自己完善
断点保存的值一般是PC-4(原因:流水线)
断点保存在R14链接寄存器(第一个断点没有保存在堆栈,但是如果要嵌套的时候,需要把前面的断点保存在堆栈)
然后要去执行中断服务程序,硬件自动的设置PC值,让他转到相应的入口地址去执行中断服务处程序(8条B指令)(不像X86去查表,去查中断向量表)
2.中断返回的时候,有时候直接将断点赋值给PC,有时候需要-4,有时候还要再-8,原因:
【需要完善】
第三章 指令系统
3.1 指令语法
3.2 & 3.3 第二个源操作数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W1d7iSDq-1683103825607)(img/image-20230430105444863.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8o6z3eW-1683103829174)(null)]
1.对于立即数型,直接装载的要求以及在不满足要求的条件下如何解决?
两种方法;
多次拼接
使用伪指令LDR(文字池)
2.弄清楚这个问题,其实也把立即数寻址和寄存器移位寻址的道理想明白了
3.4 寻址方式
都是重点,尤其是堆栈寻址的4种方式和相对寻址,考法:给例子,然后看出采用的是什么寻址方式,是怎样寻的,最后的结果又是多少?
3.5 重要指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5xLN74wr-1683103825608)(img/image-20230430105954366.png)]
3.6 常用伪指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMo3enr7-1683103829548)(null)]
3.7 LDR伪指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nxQKnaBN-1683103825609)(img/image-20230430110054183.png)]
3.8 阅读或者书写程序段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMKtkK19-1683103829257)(null)]
3.9 例题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyaIUMsG-1683103825610)(img/image-20230430110203850.png)]
交换指令的含义:
从内存单元[R2]读出的内容放到R0中,再把R1中的数据写回[R2]
指令特点
原子操作,写一次内存,读一次内存,这两个操作是原子的,不可分割的
主要应用
可以实现信号量、锁等底层功能
要求
这个数必须能给用8位立即数循环右移偶数次得到,这样的话,立即数用8位表示,移位次数用4位表示,压缩成12位
不满足要求的解决方法
把立即数拆成几个数
使用LDR伪指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ScbEdCG0-1683103829578)(null)]
(1)
指令1是汇编指令,
寻址方式:相对寻址(坑,后面虽然直接给了地址,但是ARM中不支持直接寻址,因为32位地址放不下)【004表示偏移地址】
LDR就是读存储器,把后面地址的内容放到前面的寄存器中,所以最后R0中内容是0xe1a00000
(2)
指令2是伪指令
汇编变成一条真正的LDR汇编指令
00000810处是文字池,存放的是_start标号的值,就第二条nop指令的地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTcwjtgR-1683103829565)(null)]
采用相对寻址的指令有哪几个?
LDR
STR
B指令(偏移地址24位,实际上是26位)
重点***
画图时要按字节画(大小端方式)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ihBOYhTP-1683103825613)(img/image-20230430112319547.png)]
基址加变址(4种选其1)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKbUwbnv-1683103825613)(img/image-20230430112310936.png)]
B指令,偏移地址-2补两个0,就变成了-8
B . -> 死循环
BL指令子程序调用指令,偏移范围:+-32M
超过这个范围,解决方法:
1)三级跳(跳两次)先用一条B指令,跳到一个位置,那个位置放一条BL指令(如果非要写一条B指令也可以,自己保存断点并进行返回)
2)修改PC的值,mov pc xxx,自己保存断点并进行返回
第四章
4.1 Image
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-adUnwz3f-1683103829601)(null)]
ROBase与RWBase:
ROBase:第一个代码段(只读段)的起始位置,汇编器、链接器在汇编和链接程序的时候先把ROBase设置为某一个特定的值,链接器在链接代码的时候,第一条指令的地址就是ROBase。如果不进行设置,默认为0,那么第一条指令的地址就是0.开机的时候,代码要搬到主存中去,由于ROBase设置的不一定是0,所以需要搬到特定的位置,但是PC的值刚开始是0,所以第一段代码的ROBase必须设置为0,(Entry Point),后面的代码段由第一段代码搬到合适的位置
RWBase:链接器在链接数据段的时候,你设置的多少就链接到哪里。将来装到主存的时候,必须装到这个位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sjfsbgeg-1683103825615)(img/image-20230430130120773.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ln0yKanc-1683103825615)(img/image-20230430130319534.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0PlkoS2-1683103829678)(null)]
考法:
先问一下Image相关问题(ROBase和RWBase)
另外,代码中有指令,可以问指令的寻址方式,问代码含义
4.2 ATPCS(直接考编程)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RKovrEtT-1683103829657)(null)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwRXjxDl-1683103829700)(null)]
对S3C2440编程时没有main函数,而是复位中断程序extern int A(int arg); 一般规范的做法是放在头文件,此处include头文件
汇编最后两条语句可以缩写为ldmfd sp!, {PC},但如果中间无子程序调用,也只用 mov pc, lr
main函数并没有在0地址:
在嵌入式系统中书写代码,前面需要把代码装入,加一些初始化工作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfnuVuPe-1683103825620)(img/image-20230430130521368.png)]
第五章
5.1 S3C2440
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WCVRxBm-1683103829624)(null)]
SOC的概念
S3C2440是一个SOC,它的内核是ARM...(V8?)
5.2 最小系统
5.3 存储空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1sJPoZs-1683103829637)(null)]
5.4 & 5.5 & 5.6 & 5.7 主存设计*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yOMikQeJ-1683103825622)(img/image-20230430131634307.png)]
5.6、内部有NAND Flash控制器;自启动机制
5.7、即便是使用NOR Flash,也可能使用BOOTLOADER,比如Flash中一个数据段(RW),其RWBASE设置在其它BANK
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMXdk1x4-1683103830029)(null)]
1.芯片容量
地址总数*单元大小(2^16 * 8)
2.不能,因为要按字节、半字、字访问
3.
4.
Bootloader
一开始是8条B指令
reset handler
先做各种硬件初始化,然后把其他代码从Flash搬到主存(读->写)
然后死循环
然后就是各种中断处理程序
第六章
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D873RQQr-1683103830014)(null)]
个数据段(RW),其RWBASE设置在其它BANK
[外链图片转存中...(img-PVO0F9ny-1683103825623)]
[外链图片转存中...(img-BnHbbMGI-1683103825623)]
1.芯片容量
地址总数*单元大小(2^16 * 8)
2.不能,因为要按字节、半字、字访问
Bootloader
一开始是8条B指令
reset handler
先做各种硬件初始化,然后把其他代码从Flash搬到主存(读->写)
然后死循环
然后就是各种中断处理程序
# 第六章
[外链图片转存中...(img-CQ5c0a1S-1683103825623)]