单片机编程软件是单片机开发不行短少的东西之一,目前市场流转的单片机编程软件主要为IAR单片机编程软件和KEIL单片机编程软件。
一、编译优化选项
在iar中能够设置代码的编译优化等级,在工程名上右键选OpTIons.。.,在弹框中选C++/C++ Compiler–OpTImizaTIons,如下图所示。
左面的level里边是优化等级,右边的是附加选项。假如不想往下看了又有bug体质,就把这儿的level选到None上面,点击OK。
二、优化仍是不优化
优化的意图简略来说主要有两个,削减代码量和进步程序运转功率。随之而来的是什么呢?假如编译器误认为你写的延时是“低功率”代码,假如编译器认为某些变量的生命周期能够提前结束了,假如编译器认为某些变量你界说了没有运用便是没用,就会原地爆破了。
所以仍是有必要搞了解,优化究竟优化了什么,才干决议要不要优化。
三、IAR优化了什么
1.None
有最好的debug支撑,变量的生命周期会贯穿它的整个效果域,也便是说编译器不做任何优化,只要是变量的效果域,这个变量便是有用的。
最直观的的表现便是能够在live watch中检查该变量,假如它被优化了,就检查不了了。
2.Low
仍然是具有调试支撑的,优化的是变量的生命周期,假如一个变量没有用果了,后边不会用到它了,就会把它优化掉,不让它贯穿它的整个生命周期。
这有什么优点呢?这个变量不存在了,就意味着寄存器的压力减小了许多,能够腾出更多空间给更有需求的变量。
3.Medium
除了上述优化以外,还加入了许多新的优化。
· Live-dead analysis and opTImization
代码是否可用的剖析和优化
· Dead code elimination
无用的代码铲除。
· Redundant label elimination
冗余标签消除
· Redundant branch elimination
冗余分支铲除,所以或许呈现由于对变量和分支的一起优化,导致某些条件分支分明建立却一直不会进入,一个大坑。
· Code hoisting
代码进步,很难了解的姓名,其实便是它字面意思,便是把某些代码(变量界说)说到效果域的顶部去,可笑的是界说的次序不变。也便是说,你界说了全局变量a=1,然后在某个函数里输出a,在下面界说局部变量a=2,最终输出的结果是乱码或许0,这取决于局部变量的默许初始化的值。在函数里真正被输出的,不是全局变量的a,而是局部变量的a,可是这个a只做了界说,初始化还在原方位。
· Peephole optimization
窥孔优化,浅显点说是局部优化,编译器对部分编译的代码,结合方针CPU的指令特色,做一些认为能够进步功能的优化。
· Some register content analysis and optimization
寄存器内容剖析与优化
· Static clustering
静态聚类。将在同一模块内界说的静态变量和全局变量安置成使得在相同函数中拜访的变量相互严密地存储。这使得编译器能够为多个拜访运用相同的基指针。
· Common subexpression elimination
公共子表达式消去,在编程中会有许多当地运用类似的表达式,比方:
a=b+c+d;
e=b+c+f;
这个时分能够优化成这样:
tem=b+c;
a=tem+d;
e=tem+f;
4.High
最高程度的优化。具有以上一切的优化之外,还有:
· Instruction scheduling
指令调度,编译器依据自己的指令调度器去重新安排指令,使得处理器运转时呈现的资源抵触状况更少,然后削减资源抵触引起的卡顿状况。
· Cross jumping
穿插跳动
· Advanced register content analysis and optimization
高档寄存器内容剖析与优化
· Loop unrolling
循环打开。有一些小的循环体,在编译时就能确认其循环次数,编译器会启发式得打听是否将这个循环体仿制打开,打开循环体能削减程序的迭代次数,然后加速程序的运转速度,但会添加代码的巨细。
编译器会从速度和代码巨细之间去找一个平衡点,优化速度和优化代码巨细那个装备就会影响这个优化。
· Function inlining
函数内联
假如一个比较小的函数在编译时现已能确认其精确的界说了,编译器会决议将其内联到调用者的内部,这样就会减小函数调用的开支。
· Code motion
代码移动。对循环不变的表达式和公共子表达式进行移动,防止其被再次评价。这个优化会减小程序代码体积,加速履行速度。
· Type-based alias analysis
根据类型的别号剖析。多个指针指向同一块内存,能够相互称之为内存的别号,由于这种状况会导致优化变得很困难,由于编译的时分不知道内存是否存在。所以编译器选用假定依照界说的类型分配了内存去编译优化。
阐明:上面有些优化,能够在iar中装备是否要运用。
高档其他优化选项回添加代码编译的时刻,而且会在调试的时分呈现一些困难,比方有时分想在某个方位打断点却发现打不上,由于那里的代码现已被优化掉了,有时分想看某些变量的值,却发现live watch显现这个变量无法检查,也是被优化掉了。
责任编辑;zl