历史上的今天
返回首页

历史上的今天

今天是:2025年12月09日(星期二)

正在发生

2022年12月09日 | ARM嵌入式编译器(五) 优化循环的4种方法

2022-12-09 来源:zhihu

1. 循环展开


循环执行的时间取决于循环的次数,循环中每次检查是否进行循环的条件会降低循环的性能。使用循环展开可以减少检查条件的判断次数,但是展开循环就意味着增加代码量。例如:在精确的时钟周期循环中,可以使用#pragma unroll (n)来展开循环。


“pragma”(编译指示)仅在选择优化等级为-O2/-O3/-Ofast和-Omax时有效。


编译指示的相关用法:

注:虽然给出了循环展开的编译指示,但Arm官方不建议使用,这样会影响编译器的展开优化和其他循环优化。

将代码分别复制到file.c文件中,然后使用以下命令进行编译和反汇编。


armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s


可以看到展开循环时,代码执行会更快,但代码量也更大。


2. 循环向量化


如果编译的目标含有SIMD单元,那么编译器就可以使用向量引擎来优化代码的向量部分。在优化等级为-O1,可以使用-fvectorize 来启动优化,而在-O2或更高等级时向量优化是自动启用。


要使用向量优化,在编写代码的时候需要将结构体的成员放到同一个循环中,而不能使用独立的循环。

对于每个例子,将代码分别复制到file.c文件中,然后使用以下命令进行编译和反汇编。


armclang --target=arm-arm-none-eabi -march=armv8-a file.c -O2 -S -o file.s

在64位运行状态下要避免编译器使用SIMD向量优化可以在-march或-mcpu后+nosimd;


例如:


armclang --target=aarch64-arm-none-eabi -march=armv8-a+nosimd -O2 file.c -S -o file.s


在32位运行状态下要避免编译器使用SIMD向量优化,可以通过设置-mfpu=fp-armv8;


例如:


armclang --target=aarch32-arm-none-eabi -march=armv8-a -mfpu=fp-armv8 -O2 file.c -S -o file.s


3. 循环终止


在写循环的时候如果编写不当会使得代码的运行效率降低和代码量增大。建议使用以下的终止条件:


1)使用变量类型为:unsigned int


2)使用向下减少的计数方式,以减到0作为计数结束。


3)使用简单的终止条件。


单独或组合使用以上原则的终止条件,可以获得更好的代码大小或效率。


例如:这是一个实现n!的计算程序。

用以下命令反汇编以下armclang -Os -S --target=arm-arm-none-eabi -march=armv8-a 

对比反汇编代码可以看出在递减循环中用SUBS指令代替了递增循环中ADD 和CMP两条指令。这是因为SUBS指令会自动更新Z标志。


此外在递减循环中变量n不必再循环的过程实时使用,从而减少了寄存器的数量。


如果终止条件是一个函数,则循环的每次都调用该函数,这种情况下递减的循环优势就更明显了。例如:


for (...; i < get_limit(); ...);


说明:这种递减循环计数的方式也适用于while-do 命令。




4. 无限循环


在某些情况下armclang会删除一些编译器认为没有影响的无限循环,从而导致最终程序无法正常运行。


为确保无限循环的正确编译执行,ARM官方建议在无限循环中添加__arm volatile的声明。这个声明的目的是告诉编译器删除这个无限循环会有影响,不能被优化删除。在无限循环中,把处理器设置为低功耗模式是一个不错的做法,当有中断或事件触发时再回到正常模式。


下面是一个包含__arm volatile声明的无限循环例子:


void infinite_loop(void) {


while (1)


  __asm volatile("wfe");


}




注:wfe(Wait for Event)是给处理器一个提示,使处理器进入低功耗状态,直到事件或中断触发。 作者:亿道电子 https://www.bilibili.com/read/cv18803688/ 出处:bilibili


推荐阅读

史海拾趣

Frequency Sources公司的发展小趣事

随着技术的不断成熟和市场的日益扩大,Frequency Sources公司开始积极拓展国内外市场。公司通过参加国际电子展会、建立海外销售网络、与跨国企业建立合作关系等方式,不断提升品牌知名度和市场份额。同时,公司还针对不同地区的市场需求,定制化开发符合当地标准的产品和服务,进一步增强了市场竞争力。在国际化战略的推动下,公司的业务遍布全球多个国家和地区,实现了跨越式发展。

海芯科技(AVIA)公司的发展小趣事

海芯科技自创立以来,一直秉持着创新和技术的核心理念。在公司的初期阶段,创始人凭借其丰富的行业经验和敏锐的市场洞察力,成功吸引了一批技术精湛、充满激情的团队成员。这些成员在各自的领域里都有深厚的背景和出色的能力,他们共同构成了海芯科技的核心研发团队。在公司的发展初期,这支团队便通过不断地技术创新和研发,为公司后续的发展奠定了坚实的基础。

东晨(DC)公司的发展小趣事

东晨(DC)公司深知市场需求的重要性,因此制定了精准的市场策略。公司通过深入研究消费者需求,不断推出符合市场趋势的新产品。同时,东晨(DC)公司还注重与渠道商的合作,通过建立稳定的销售渠道,将产品快速推向市场。此外,公司还积极参与各种展会和论坛,展示最新技术和产品,赢得了客户和业界的广泛赞誉。

Holy Stone公司的发展小趣事

经过多年的发展,Holy Stone成为国内少数涵盖主、被动双通路并拥有制造工厂的多元化公司。公司不仅代理多家国际知名半导体零组件,还通过自主研发和生产,为客户提供完整的解决方案及多样性零组件。这一双通路战略使得Holy Stone能够在激烈的市场竞争中保持领先地位,并成功实现全球布局。公司的产品广泛应用于消费电子、汽车电子等多个领域,满足了全球客户的多样化需求。

ABECO公司的发展小趣事

随着业务的发展,ABECO在1970年做出了一个大胆的决定——进军马耳他市场。这一决策既带来了挑战,也带来了机遇。公司需要适应新的市场环境,了解当地的需求和文化。经过一段时间的摸索和努力,ABECO凭借其高品质的产品和专业的服务,成功在马耳他市场打开了局面,为后续的发展奠定了坚实的基础。

Hendon Semiconductors公司的发展小趣事

随着电子产品的不断小型化和集成化,表面贴装技术(SMT)成为了电子制造行业的重要趋势。Hendon Semiconductors紧跟这一趋势,不断提升其表面贴装和精密制造能力。公司引进了先进的生产设备和测试仪器,确保产品的质量和可靠性。同时,Hendon Semiconductors还加强了对生产过程的监控和管理,通过严格的质量控制体系确保每一片电路板都符合客户的要求。

问答坊 | AI 解惑

功放集成电路30例.pdf

功放集成电路30例.pdf…

查看全部问答>

2N6227可以用ORCAD中哪个元件替换

2N6227可以用ORCAD中哪个元件替换…

查看全部问答>

C100或6410摄像头捕捉视频显示的问题(有视频,有真相)

先说下我是怎么玩的,模拟摄像头->TW9910->C100 CameraIF->Post Processor->Frame Buffer->LCD 问题描述请看视频: http://v.youku.com/v_show/id_XMTc3OTc3MDU2.html 视频的左侧大概2/5有时候会跑到右边去,但是刷新界面,或者改变界面后,会变 ...…

查看全部问答>

如何将控制台数据自动分工位显示到终端

如何将控制台数据自动分工位显示到终端 例: 工位号分为  A 、B 、C 、D 、E 、F     分别显示到 A 、B 、C 、D 、E 、F 终端 …

查看全部问答>

我的流接口驱动没有去CreatFile它,它怎么莫名就被打开了呢?NK执行的时候只是Init它吧,应该不会Open它。追踪了不知道在什么地方打开了

我的流接口驱动没有去CreatFile它,它怎么莫名就被打开了呢?NK执行的时候只是Init它吧,应该不会Open它。追踪了不知道在什么地方打开了…

查看全部问答>

像墙纸可卷曲的LED灯,离我们不远

replyreload += \',\' + 679761;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

温度传感器的材质有哪些?

温度传感器的材质有哪些? 对于腐蚀类的大家会选什么材料?…

查看全部问答>

从今天开始慢慢的学LM3S811

已经拿到这块板子很久了 都没怎么学 现在开始吧 因为国赛的遗憾 也是由于自己的代码稳定性不好 也许这样公开帖代码 帖进度才会比较大的提高吧 我用的是一块学长给的 据说是省赛 TI 发的  就是绿色那块 和仿真器在一块板子上的 没有 ...…

查看全部问答>

无锡华大国奇科技有限公司招custom layout工程师一名

各位同学,我是官志勇。无锡华大国奇科技有限公司IP开发部门招custom layout工程师一名。 工作地点是在上海,具体在汉口路400号华盛大厦20层。 要求: 1. 有三-五年的ASIC产品版图设计经验;当然长一点也可以,主要要求是可以独立工作; 2. 能 ...…

查看全部问答>

关于STM8S003芯片内部ADC扫描问题求助

求助,为什么我用STM8S003内部的ADC扫描模式,开启了数据缓冲,每次在ADC中断到来,在中断里面只能读到通道3之前的数据,3通道之后通道的数据就读不到了怎么回事? …

查看全部问答>