STM32 IAR 优化选项介绍

发布时间:2023-03-06  

这篇文章给大家介绍一下STM32 IAR优化选项的设置

IAR优化选项包括:无优化低等级优化中等优化高等优化





公共子表达式压缩

公共子表达式压缩是较为常见的优化方式,这种方式既可以较少代码的大小,也可以缩短运行的时间,编译器可能会根据代码上下文产生更加复杂的优化结果,比如对数组或矩阵进行访问时,需要的数组索引计算,有的时候代码中可能会使用大量的宏,虽然在代码中比较简洁,但也可能在代码中产生很多重复计算,编译器使用这种优化也会有很好的结果。

在公共子表达式压缩优化中,不仅会使用寄存器,也有可能会使用在内存中的临时变量,但是因为部分代码的执行被优化,所以优化后的代码可能会比较难进行调试。



循环展开

循环展开是在编译时已确定需要循环的次数,将循环体展开,来降低每次循环循环体外的运算开销。

这种优化适用于小循环,因为小循环的循环体外运行开销比重比较大,降低循环次数会明显提高整体的执行效率。显然,这种循环的展开会增加代码的大小,但是编译器会多次进行试探性编译,然后计算编译后代码的执行速度和大小,并根据用户的选择来决定如何进行优化。同样,优化后的代码与原来的代码有很大的不同,也会造成调试上的困难。



函数内联

函数内联可以减少函数调用时产生的运行开销,缩短执行时间,但可能会增加代码的大小,一般情况下,选择代码量优先时使用该优化不会增加代码的大小。

是否进行函数内联优化取决于编译器进行的试探性编译。

同样,优化后的代码可能比较难进行调试。



循环不变量外提

在许多循环中,通常有一些表达式或运算的结果在循环中是不会改变的,那么这部分内容可以将其转移到循环外部,就可以节省许多循环的工作量。

这种优化通常既可以节省代码空间,也可以提高运行的效率,但同样会导致优化后的代码比较难进行调试。



基于类型的别名分析

当两个或者更多的指针访问同一个地址时,其中任意一个变量或者指针就称为其他变量或者指针的别名变量。

如果程序中存在别名变量,会使程序优化变得非常困难,因为在编译时不可能知道一个指定地址上的数据是否被改变了。

基于别名分析的优化,假设所有访问都是基于被访问对象所声明的类型,这样可以由编译器来判断是否有多个指针访问了同一块存储区。

对于标准C或者C++程序,这种优化可以减少代码的大小,降低执行时间。

对于非标准的C或者C++程序,可能会导致生成错误的代码。

静态变量重组

一般情况下,全局和静态变量的位置是根据编译器编译的先后次序进行分配。使用静态变量重组优化后,同一模块中的静态和全局变量会被重新组织,尽量靠近在一起,这样编译器就可以使用同一个机制来访问多个变量。



指令规划

合理的汇编指令规划能够有效发挥处理器的处理能力,能够将资源访问冲突导致的流水线等待降到最低。



其他代码优化



优化选项调整的次序:从低级到高级,从部分到全局。

在程序设计中,如果对个别等级的函数需要进行精确的优化调整,可以使用预处理命令,单独定制函数的优化选项。

有些时候在进行读写共享变量、读写外设寄存器端口或者运行存在副作用的其他操作时,不希望编译器进行调整运算或赋值次序、删除认为没有作用的代码、将变量分配在通用寄存器里等等这些优化操作,那么可以使用volatile对所要操作的对象进行声明。

一般可以在以下情况使用volatile

  • 对象的值会在编译器不知道的情况下发生改变,例如外设寄存器的值发生改变;

  • 程序进行的操作具有副作用,例如连续读或写某外设寄存器两次,硬件上具有特定的意义;

  • 有多个程序共享被操作的对象,例如操作系统中的多个任务,主程序和中断服务程序。

使用volatile后,被声明的变量不会被分配在通用寄存器中,程序对这些变量的访问次序也不会被编译器改变,对变量的访问不会被删除。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    程序执行可能就直接把寄存器的值赋值给变量b这个内存地址了,而不是重新从变量a的内存地址里读取到寄存器,这样效率就提高了。 编译器优化原则之一:减少对内存访问的次数,因为从内存里读写数据效率比较低。 三.volatile到底有什么用......
    足能效导向需求以后,才会去尝试堆叠出性能的部分。” 移动光追的技术和生态布局 可能更多同学比较关注的并不是谁家的光追硬件实现如何,而是移动光追游戏什么时候来,以及堆像RTU这样的单元究竟有什么用。原本......
    (Android开放源代码项目)。如此看来,小米自研操作系统还可能有车机、平板、手表等终端系统,而且小米走的是华为鸿蒙操作系统的路子,前期先兼容安卓更为稳妥,保住既有的用户量。 不过,从此前华为开发者......
    智能戒指有什么功能和作用 智能戒指nfc怎么用的;  智能戒指有什么功能和作用   智能戒指是一种集成了智能科技的戒指,具有多种功能和作用,以下是常见的功能和作用:   1. 健康监测:智能......
    说一定你要过来上手实践,看实践能力,看你的工作能力。那些题有什么用?没有什么大用处。所以别太在意那些题,咱们要招的是能做点活的(员工)。” ▲相关报道截图 其实,仔细分析这份试卷就会发现,前面......
    。2023年8月,启动鸿蒙OS 4.0开发者Beta版第一期招募。 雷军也表示,小米澎湃OS 应运而生,我们已经准备了很久。2014年,从IoT业务开始初具规模,我们就开始了探索式开发和验证。2017年,全新......
    Bootloader解锁权限将仅针对开发者和手机发烧友开放,其中最主要的限制就是“社区成长等级达到5段”,引起大量用户吐槽。 出于安全因素的考量,若MIUI系统下的Bootloader锁处......
    mate40系列等等多款机型将可以首批升级更新到鸿蒙3.0系统。 安卓智能手机方面我们现在来说说基于安卓底层开发的小米MIUI系统,现在距离小米MIUI13系统推出已经有近一年的时间,大家......
    4090,去1080P分辨率下玩游戏 2、你可否听说过A卡优化游戏? 3、还是卖不过NV,有什么用? 显然,部分N饭有些过于激动了,着急来维护N卡的名声。实际上,后续该媒体4K分辨率成绩显示,RTX......
    行业首个)。值得一提的是,此前这三块屏幕便已经获得德国莱茵T?V颁发的硬件级低蓝光产品认证。 ●莱茵TUV无频闪认证是什么有什么用?    莱茵无频闪认证(TUV Rheinland......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>