嵌入式代码优化

优化概述
代码优化:时间优化,空间优化
代码优化与程序的可读性矛盾
需要优先优化的代码对象:程序频繁使用的代码

一般情况下,编译器是保守的,以便使较坏的代码也能编译通过
因此高效的C程序可以通过研究编译器如何把C代码转换成ARM汇编代码,以帮助程序员区分快速和慢速的C代码,进而指导程序员进行C程序设计。

1.变量的数据类型选择
在32位系统架构下
①采用整形类型,省去了多余的移位操作
②尽量使用int类型,仅使用char short 的溢出归零特性
因为在32位系统架构下实现char类型要多一条与0xFF相与的汇编指令,使用短整型则需汇编语言的移位操作,增加了汇编指令,降低了程序效率。

2.循环优化
循环是代码优化的重点
C语言主要通过for和while来实现循环

固定次数的循环
采用减计数
ARM汇编中实现循环只需要两条指令
①减法指令用作循环计数,同时设置结果条件标志(减法指令的特性)
②一条条件分支指令

for (i=64;i!=0;i--)

从汇编语言角度来看,加法计数有3条指令作为循环的开销,减法指令只需2条

不定次数的循环

do...while()

的使用能展现出更好的性能和代码密度,前提是程序员要保证至少循环一次

循环展开

/*假设需要累加的个数是4的倍数*/
 int checksum(int *data,unsigned int n)
 {
    
    
     int sum = 0;
     do{
    
    
          sum += *(data++);
          sum += *(data++);
          sum += *(data++);
          sum += *(data++);
          n -= 4;
       }while(n != 0);
      return sum;
 }

假设n = 20 优化前执行83条语句,优化后执行53条语句
循环展开的缺点:代码量增加,cache空间占用问题
因此要具体问题具体分析找到平衡点

3.指针别名
别名:当两个指针指向同一个对象时,这两个指针被称作该对象的别名
增加局部变量避免多次提取

void timers_v1(int *timer1 ,int *timer2 ,int *step)
{
    
     
       *timer1 = *step;
       *timer1 = *step;
}
/*增加局部变量避免指针两次提取*/
void timers_v2(State *state ,Timers*timers)
{
    
    
       int step = state ->step;
       timers ->timer1 += step;
       timers ->timer2 += step;
}

4.结构体
地址对齐问题
数据存取的效率问题
结论:
要把所有八位元素安排在结构体的前面
依次安排16位、32位元素
把数组和大元素安排到后面
结构体太大的话,可以构建子结构体,编译器可以单独维持其指针

猜你喜欢

转载自blog.csdn.net/weixin_43965599/article/details/114276348
今日推荐