STM32 IAR 优化选项介绍
大家好,我是单片机一哥,这篇文章给大家介绍一下STM32 IAR优化选项的设置
IAR优化选项包括:无优化、低等级优化、中等优化、高等优化。
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程和毕业设计指导,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像白色字体加我也能领取哦,记得回复一哥///
公共子表达式压缩
公共子表达式压缩是较为常见的优化方式,这种方式既能够较少代码的大小,也能够缩短运行的时长,编译器可能会依据代码高低文产生愈加复杂的优化结果,假如对数组或矩阵进行访问时,须要的数组索引计算,有的时候代码中可能会使用大量的宏,虽然在代码中比较简洁,但也可能在代码中产生很多反复计算,编译器使用这种优化也会有很好的结果。
在公共子表达式压缩优化中,不仅会使用寄存器,也有可能会使用在内存中的临时变量,但是由于局部代码的执行被优化,所以优化后的代码可能会比较难进行调试。
循环展开
循环展开是在编译时已确定须要循环的次数,将循环体展开,来降低每次循环循环体外的运算开销。
这种优化适用于小循环,由于小循环的循环体外运行开销比重比较大,降低循环次数会明显提高整体的执行效率。显然,这种循环的展开会增加代码的大小,但是编译器会屡次进行试探性编译,然后计算编译后辈码的执行速度和大小,并依据用户的选择来决定如何进行优化。同样,优化后的代码与原来的代码有很大的不同,也会造成调试上的艰难。
函数内联
函数内联能够减少函数调用时产生的运行开销,缩短执行时长,但可能会增加代码的大小,一般情况下,选择代码量优先时使用该优化不会增加代码的大小。
是否进行函数内联优化取决于编译器进行的试探性编译。
同样,优化后的代码可能比较难进行调试。
循环不变量外提
在许多循环中,通常有一些表达式或运算的结果在循环中是不会改变的,那么这部分内容可以将其转移到循环外部,就可以节省许多循环的工作量。
这种优化通常既可以节省代码空间,也可以提高运行的效率,但同样会导致优化后的代码比较难进行调试。
基于类型的别名分析
当两个或者多个的指针访问同一个地址时,其中任意一个变量或者指针就称为其他变量或者指针的别名变量。
假如程序中存在别名变量,会使程序优化变得非常艰难,由于在编译时不可能知道一个指定地址上的数据是否被变更了。
基于别名分析的优化,假设所有访问都是基于被访问对象所声明的类型,这样能够由编译器来判断是否有多个指针访问了同一块存储区。
对于规范C或者C++程序,这种优化能够减少代码的大小,降低执行时长。
对于非规范的C或者C++程序,可能会导致生成错误的代码。
静态变量重组
一般的情况下,全局和静态变量的位置是根据编译器编译的先后次序进行分配。使用静态变量重组优化后,同一模块中的静态和全局变量会被重新组织,尽量靠近在一起,这样编译器就能够使用同一个机制来访问多个变量。
指令规划
合理的汇编指令规划能够有效发挥处理器的处理能力,能够将资源访问冲突导致的流水线等待降到最低。
其他代码优化
优化选项调整的次序:从低到高级,从部分到全局。
·在程序设计中,假如对个别等级的函数须要进行精确的优化调整,能够使用预处理命令,单独定制函数的优化选项。
·有些时候在进行读写共享变量、读写外设寄存器端口或者运行存在副作用的其他操作时,不希望编译器进行调整运算或赋值次序、删除认为没有作用的代码、将变量分配在通用寄存器里等等这些优化操作,那么能够使用volatile对所要操作的对象进行说明。
一般可以在以下情况使用volatile
·对象的值会在编译器不知道的情况下发生改变,例如外设寄存器的值发生改变;
·程序进行的操作具有副作用,例如连续读或写某外设寄存器两次,硬件上具有特定的意义;
·有多个程序共享被操作的对象,例如操作系统中的多个任务,主程序和中断服务程序。
使用volatile后,被声明的变量不会被分配在通用寄存器中,程序对这些变量的访问次序也不会被编译器改变,对变量的访问不会被删除。
想要学习单片机的朋友 ,做毕业设计的同学,关注我们,回复一哥,与导师一起学习成长,共同进步,还有更多资料领取。
说了这么多,大家记得留意下方评论第一条(或者私信我)有干货~
-END-
*本文系网络转载,版权归原作者所有,如有侵权请联系删除