您的位置 首页 传感器

ARM规划思维与高效C编程

一.RISC设计思想ARM内核采用RISC体系结构。RISC是一种设计思想,其目标是设计出一套能在高时钟频率下单周期执行,简单而有效的指令集。RISC的设计重点在于由硬件执行的指令的复杂度,这是因为软

一.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的结构体增加填充位,这样,结构体的组织将不会依靠于编译器。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/281351.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部