一.RISC规划思维
ARM内核选用RISC体系结构。RISC是一种规划思维,其方针是规划出一套能在高时钟频率下单周期履行,简略而有用的指令集。RISC的规划要点在于由硬件履行的指令的杂乱度,这是由于软件比硬件简单供给更大的灵活性和更高的智能。因而,RISC规划对编译器有更高的要求;相反,传统的杂乱指令集的计算机(CISC)则更侧重于硬件履行指令的功能性,使CISC变得更杂乱。
RISC规划思维主要由下面4个规划原则来完结:
·指令集
RISC处理器减少了指令品种,每条指令的长度都是固定的,答应流水线在当前指令译码阶段去取其下一条指令;而CISC处理器中,指令的长度一般不固定,履行也需求多个周期。
·流水线
在抱负情况下,流水线每周期行进一步,可获得最高的吞吐率;而CISC指令的履行需求调用微代码的一个微程序。
·寄存器
RISC处理器具有更多的通用寄存器,每个寄存器都可寄存数据或地址。寄存器可为一切的数据操作供给快速的部分存储拜访;而CISC处理器都是用于特定意图的专用 处理器。
·load-store结构
处理器只能处理寄存器中的数据。独立的load和store指令用来完结数据在寄存器和外部存储器之间的传送。由于拜访存储器很耗时,所以把存储器拜访和数据处理分隔。这样有一个优点,那便是可重复地运用保存在寄存器中的数据,而防止屡次拜访存储器。相反,在CISC结构中,处理器能够直接处理存储器中的数据。
二.ARM规划思维
为下降功耗,ARM处理器已被特别规划成较小的核,较高的代码密度。ARM内核不是一个朴实的RISC体系结构,这是为了使它能够更好的习惯其主要应用领域-嵌入式体系。在某种意义上,乃至能够以为ARM内核的成功,正是由于它没有在RISC概念上沉入太深。现在体系的要害并不在于单纯的处理器速度,而在于有用的体系功能和功耗。
面向嵌入式体系的指令集
·一些特定指令的周期数可变
例如:多寄存器装载/存储的load/store指令的履行周期便是不确认的
·内嵌桶形移位器发生了更为杂乱的指令
·Thumb 16位指令集
·条件履行
·增强指令
三.高效的C编程
1)C数据类型的有用用法
·关于寄存在寄存器中的部分变量,除了8位或16位的算数模运算符外,尽量不要运用char和short类型。而要运用有符号或许无符号的int类型。除法运算时运用无符号数履行速度更快。
·关于寄存在主存储器中的数组和全局变量,在满意数据巨细的前提下,应尽或许运用小尺度的数据类型,这样做能够节约存储空间。ARMv4体系结构能够有用的装载和存储一切宽度的数据,并能够运用递加数组的指针来有用的拜访数组。关于short类型数组,要防止运用数组基地址的偏移,由于LDRH指令不支持偏移寻址。
·由于隐式或许显式的数据类型转化一般会有额定的指令周期开支,所以在表达式中应尽量防止运用。load和store指令一般不会发生额定的转化开支,由于load和store指令是主动完结数据类型转化的。
·关于函数参数和返回值应尽量防止运用char和short类型。即便参数规模比较小,也应该运用int类型,以防止编译器做不必要的类型转化。
2)高效的编写循环体
·运用减计数到零的循环结构,这样编译器就不需求分配一个寄存器来保存循环间断值,而且与0比较的指令也能够省掉。
·运用无符号的循环计数值,循环持续的条件为i!=0而不是i>0,这样能够确保循环开支只要两条指令。、
·假如事前知道循环体至少会履行一次,那么运用do-while循环要比for循环好,这样能够使编译器省去检查循环计数值是否为0的过程。
·打开重要的循环体可下降循环开支,但不要过度打开,假如循坏的开支对整个程序来说占的份额很小,那么循环打开反而会增加代码量并下降cache功能。
·尽量使数组的巨细是4或8的倍数,这样就能够简单地以2,4,8次等多种挑选打开循环,而不需求忧虑剩下数组元素的问题。
3)高效的寄存器分配
·应该尽量约束函数内部循环所用部分变量的数目,最多不超越12个,这样,编译器就能够把这些变量都分配给ARM寄存器。
·能够引导编译器,经过检查是否归于最内层循环变量来确认某个变量的重要性
4)高效的调用函数
·尽量约束函数参数不要超越4个,这样函数调用的功率会更高。也能够将几个相关的参数组织在一个结构体中,用传递结构体指针来替代多个参数。
·把比较小的被调用函数和调用函数放在同一个原文件中,而且要先界说,后调用,编译器就能够优化函数调用或许内联较小的函数。
·对功能影响较大的重要函数可运用要害字_inline进行内联。
5)防止指针别号
·不要依靠编译器来消除包括存储拜访的公共子表达式,而应树立一个新的部分变量来保存这个表达式的值,这样能够确保只对这个表达式求职一次。
·防止运用部分变量的地址,不然对这个变量的拜访功率会比较低。
6)高效的结构体组织
·结构体元素要依照元素的巨细来摆放,以最小的元素放在开端,最大的元素组织在最终。
·防止运用很大的结构体,能够运用层次化的小结构体来替代。
·为了进步可移植性,人工对API的结构体增加填充位,这样,结构体的组织将不会依靠于编译器。