|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
arm c语言笔记veneers小程序,一种用于THUMB和ARM之间切换用的1. 尽量避免用除法,在ARM体系中它是调用C中的相关函数实现的,会占用很长时间。C-library function (__rt_sdiv for signed and __rt_udiv forunsigned division). 尽量用无符号的操作数来运算。有符号数会编译成更多的汇编代码。在做同2相关的操做(乘以2,除以2,或是2的倍数)时,使用移位。Division by a constantIt is possible to write functions which implement divisions by a certain constant much faster than the general divide function. The ARM C-library contains two such functions, namely signed and unsigned division by 10 (to speed up decimal printing).If division by other constants is commonly used in your particular application, it may beworthwhile writing specific routines to implement them.Both ARM and Thumb versions of a division by a constant generator program are provided in examples\explasm\div.c and examples\thumb\div.c subdirectories2.条件执行 所有的ARM指令都是在条件下执行的,每个32位指令中有四位是条件标志。 指令MVN a0,#0;a0保存的是-1 . 最好保持IF else 语句中的主体尽可能的简单,并且相似的应当组合在同一组内。3布尔表达式范围检查时There is a faster way to implement this: (x >= min && x < max) can be transformed into (unsigned)(x-min) < (max-min). This is especially beneficial if min is zero.4.循环 建议使用从顶自下的( count down to zero)的循环,和尽可能简单的结束条件。同样适用于while 和do loop unrolled 循环解开 一些较小的循环数可以解开,但是会付出代码增大的代价。5.switch 语句应尽量的紧密。A switch is dense if case labels comprise more than half the range spanned by the labels with the minimum and maximum values. 6.寄存器分配 基本类型:整型,浮点数,结构体均可分配在寄存器中以提高速度。如果一个变量是函数中的参数或局部变量,和如果它的地址没被调用或着调用了没有被赋与别的值,那么它可以被分配给寄存器。 局部变量 经常需要在函数之间调用变量的地址,作为函数的参考变量在函数间传递。这意味着不能分配寄存器给变量,解决之道是采用一个变量的副本,函数调用时采用的是副本的地址。 全局变量 它不会被分配给寄存器,除非采用_global_reg来声明。使用它时会导致过多的LOADSTOR操做,所以应避免在关键循环中使用全局变量。指针链 常用在访问结构体中的成员。访问这样的变量时,可以先引入结构体的一个副本,然后在函数中操做副本。避免变量的溢出,限制活动变量的数目,可以通过在函数体内定义尽可能少的变量,和将一个大的函数分解为较小的。对于经常使用的变量可用,register声明,但不能保证它一直占用寄存器。7. 变量类型。采用适当的数据类型可以有效地减少代码体积或提高其效能。局部变量,如果可能的话,避免使用,char或short 类型,因为它们在编译中会进行符号扩展或0扩展移位操做。为了避免,采用int或unsigned int 类型。全局变量。8. 函数 keep functions small and simple. 函数调用,APCS规定可以有四个变量传递给寄存器,过多的话会采用栈保存。建议函数中的参数尽量小于四个,如果不行的话,应保证付出的代价是相当的。传递相关的参数,可以建一个结构体来保有参数,再传递结构体的地址。处理结构体,long long ,double可以使用__value_in_regs 采用叶子函数,函数内没有调用其它函数,并且避免有浮点,除法操作,函数较小时可以采用__inline.纯函数。9lookup tables10.typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的 *//* 函数指针类型 */lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向*//* CPU启动后所执行第一条指令的位置 */lpReset(); /* 调用函数 */ |
|