第一章 基于Arm的嵌入式系统
RISC 与 CISC
如何区别RISC和CISC的不同呢?因为RISC都是单周期的简单指令为主,所以RISC设计对编译器的要求更高,降低了硬件执行的复杂度。相反,CISC对硬件执行指令要求更高。
RISC 设计准则
- 指令集:由于RISC简化了指令种类,复杂的操作需要若干条指令组合执行。且每条指令的长度都是固定的;
- 流水线:流水线执行以提高CPU的吞吐量;
- 寄存器:RISC处理器拥有更多的通用寄存器,可以存放数据或者地址,为数据操作提供快速的局部存储访问;
- load-store结构:数据都在寄存器中处理(load指令从存储器复制数据到内核的计算器,store指令从寄存器里复制数据到存储器);
存储器的数据宽度
存储器的数据宽度是指每次访问存储器所返回的数据位数。
如果一个32位ARM指令和16位宽度的存储器芯片,则处理器每次取指就需要2个16位的存储器访问,会降低系统的性能;
第二章 ARM 处理器基础
寄存器
通用寄存器可以用来保存数据和地址;(用前缀字母r来标识)
流水线
流水线式RISC处理器执行指令时的工作方式。使用流水线,可以在取下一条指令的同时译码和执行其它的指令,从而加快系统的吞吐。
异常、中断及向量表
当异常或者中断发生时,处理器会把PC设置位一个特定的存储器地址。这一地址存放着一个中断向量表。向量表的入口时一些跳转的指令,跳转到专门处理某个中断或者异常的子程序处。
存储管理
通常嵌入式设备使用多个存储设备,因此需要实施某种策略或者方式来组织和管理这些存储设备,并保护系统,避免一些非法访问硬件。
ARM内核的存储器管理硬件有3种不同的类型:
- 无硬件保护;
- MPU(有限保护存储器管理单元);
- MMU(全面保护存储器管理单元);
MMU是ARM上最广泛的存储器管理硬件,MMU使用一组转化表,提供虚拟地址与物理地址的映射与访问权限;
第五章 高效的C编程
- 局部变量类型:大多数ARM数据处理器都是32位的,基于这个原因,局部变量应尽可能使用32位的数据类型int或者long,可以有效改善性能并减小代码尺寸。而且使用char或者short可能出现数据溢出归零的情况。
- 函数参数类型:同局部变量类型一样,使用char或者short类型的函数参数和返回值都会产生额外的开销,导致性能的下降,增加代码的冗余;
- 有符号数与无符号数:在程序中执行加法、减法和乘法,有符号与无符号数没有区别。但是除法运算中,有符号数会增加一个步骤。
- 循环结构(定次数):无论对于有符号还是无符号的循环计数值,使用
i != 0
作为循环的结束条件,比i>0
少了一条指令。(使用减计数到0的循环结构,编译器可以不需要分配一个寄存器来保存循环终止值,而且与0比较的指令也可以省略) - 循环结构(不定次数):使用
do-while
循环结构比for
循环结构可以减少2个周期; - 寄存器分配:尽量限制函数内部局部变量的数目,这样编译器就可以把这些变量分配给ARM寄存器;
- 结构体安排:
- 结构体元素按照大小来排列,最小的元素放在开始,最大的元素安排在最后;
- 避免使用很大的结构体,可以用层次化的小结构体来代替;