STM32提高程序运行效率的方法

STM32正常运行时对程序运行效率要求不是很高,但是在中断中要求快进快出,尤其是中断数量多且中断里处理的任务较多时,对程序的运行时间及效率要求比较苛刻,可以从以下几点优化程序:

(1)设定合适的编译优化选项

Optimization level -O0
-O0禁用所有优化。使用-O0可以加快编译和构建时间,但是生成的代码比其他优化级别要满。与其他优化级别相比,-O0的代码大小和堆栈使用率明显要高。生成的代码与源代码密切相关,但生成的代码要多得多,包括死代码。
Optimization level -O1
-O1支持编译器中的核心优化。因为这个级别比-O0提供了更好的代码质量,因此它能提供了很好的调试体验。堆栈的使用也在-O0的基础上有所提高。为了获得良好的调试体验,Arm推荐使用此选项。
-O1与-O0的区别是:
1.使能了优化,这可能会降低调试信息的保真度。
2.内联和尾调是启用的,意味着回溯可能不会提供运行函数的堆栈,而这个堆栈可能是在读源代码过程中是被需要的。
3.如果不需要结果,则可能不会在预期的位置调用没有副作用的函数,或者可能会省略该函数。
4.变量的值在不再使用之后可能在其范围内不可用。例如,它们的堆栈位置可能已经被重用。
Optimization level -O2
与-O1相比,-O2具有更高的性能优化。与-O1相比,它增加了很少的新优化,并更改了优化的启发式。这是编译器可能生成向量指令的第一个优化级别。它还会降低调试体验,并可能导致比-O1更大的代码大小。高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。
-O2与-O1的区别是:
1.编译器认为对于内联调用站点有利的阈值将可能会增加;
2.执行的循环展开量可能会增加;
3.可以为简单的循环和独立标量操作的相关序列生成向量指令;
Optimization level -O3
最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。另外,可以通过单独设置 --loop_optimization_level=option 来控制循环展开的优化等级。
总结:
优化等级越高,生成的执行文件越小,但是编译速度会越慢。目前单片机性能来说,不需要刻意压缩执行文件容量。
优化等级越高,越容易影响仿真调试信息的保真度,同时,可能会影响到代码逻辑(例如if和else逻辑),以及函数内部需要再次声明的结构体而不再声明(加static可以解决)。目前测试,建议使用level 0优化等级。

(2)使用自加、自减指令

通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的程序代码,编译器通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1之类的指令,有很多C 编译器都会生成2~3个字节的指令。

(3)减少运算的强度(使用位操作)

可以使用运算量小但功能相同的表达式替换原来复杂的的表达式(STM32中可采用直接操作寄存器的方式,减少函数调用,因为函数调用需要上下文切换)
①求余运算
a=a%8; 可以改为:a=a&7;
说明:位操作只需一个指令周期即可完成,而大部分的C编译器的“%”运算均是调用子程序来完成,代码长、执行速度慢。通常,只要求是求2n 方的余数,均可使用位操作的方法来代替。
②用移位实现乘除法运算
a=a*4;  b=b/4; 可以改为:a=a<<2;  b=b>>2;
说明:通常如果需要乘以或除以2n,都可以用移位的方法代替。在ICCAVR 中,如果乘以2n,都可以生成左移的代码,而乘以其它的整数或除以任何数,均调用乘除法子程序。用移位的方法得到代码比调用乘除法子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位的方法得到结果,如:
a=a*9; 可以改为:a=(a<<3)+a;

(4)减少判断语句

能够使用条件编译(ifdef)的地方就使用条件编译而不使用if语句,有利于减少编译生成的代码的长度。

(5)尽量少用全局变量,多用局部变量

因为全局变量是放在数据存储器中,定义一个全局变量,MCU就少一个可以利用的数据存储器空间,如果定义了太多的全局变量,会导致编译器无足够的内存可以分配;而局部变量大多定位于MCU内部的寄存器中,在绝大多数MCU 中,使用寄存器操作速度比数据存储器快,指令也更多更灵活,有利于生成质量更高的代码,而且局部变量所的占用的寄存器和数据存储器在不同的模块中可以重复利用。

(6)使用尽量小的数据类型

能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C 编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 导致程序运行慢的原因可能有很多,以下是一些可能的原因和解决方法: 1. 代码优化不够:检查代码是否有重复的计算、循环次数过多等问题,可以通过优化算法和减少重复计算等方式来加速程序运行。 2. 时钟频率不足:检查时钟频率是否足够高,如果时钟频率过低,可以尝试提高时钟频率来加速程序运行。 3. 程序存储器读取速度慢:检查程序存储器的读取速度是否够快,如果读取速度过慢,可以尝试使用高速存储器或者增加缓存来提高读取速度。 4. 外设操作频率过低:检查外设操作频率是否够快,如果频率过低,可以尝试使用更快的外设或者调整外设操作方式来提高操作频率。 5. 中断处理不当:中断处理过程中如果出现了延迟或者占用了太多的CPU时间,会导致程序运行变慢,可以检查中断处理函数的执行时间,尽量减少占用CPU时间。 6. 调试信息输出频繁:如果程序中频繁输出调试信息,会占用很多CPU时间,可以尝试减少调试信息的输出频率。 希望以上方法能够帮助到你解决问题。 ### 回答2: 如果您的STM32程序运行很慢,可能有以下几个原因: 1. 程序优化不足:您的代码可能存在一些低效的算法或者重复的计算,导致程序执行速度变慢。您可以通过优化算法,减少循环次数,或者使用适当的数据结构来加快程序运行速度。 2. 硬件资源利用率低:您的程序可能没有充分利用STM32芯片的硬件资源,例如DMA(直接内存访问),中断控制器等。您可以检查并使用这些硬件资源,以提高程序的执行效率。 3. 软件配置不当:您可能没有正确配置STM32芯片的时钟,外设等参数,导致系统性能下降。您可以参考芯片的数据手册和相关开发板的资料,正确配置软件参数。 4. 调试代码开启:如果在调试过程中,您的程序使用了调试代码,例如printf语句或延时操作等,这些代码会对程序的执行速度产生一定的影响。在正式发布版本之前,您可以尝试将这些调试代码关闭,以提升程序的运行速度。 总之,解决程序运行速度慢的问题需要综合考虑软件和硬件方面的因素。通过优化算法,合理利用硬件资源,配置正确的软件参数,并合理使用调试代码,您可以提高STM32程序的运行速度。 ### 回答3: 我的STM32程序运行较慢可能有以下几个原因。 首先,可能是程序中存在一些效率低下的算法或代码。在设计和编写程序时,需要尽量使用高效的算法和优化的代码,以减少程序的执行时间和占用的系统资源。可以通过优化数据结构、循环结构以及使用适当的编译选项等方法提高程序的运行速度。 其次,系统资源不足也可能造成程序运行缓慢。STM32芯片具有有限的存储空间和处理能力,如果程序运行时需要占用大量的资源,那么系统可能无法有效地处理请求,导致程序运行缓慢。此时可以考虑优化内存的使用,减少资源占用,或者使用外部存储器扩展系统的资源。 另外,程序中可能存在一些阻塞操作或延时函数。这些操作会导致程序在等待某些事件发生时停止执行,从而造成整个程序的运行速度变慢。可以通过使用中断、定时器等机制来优化程序的阻塞操作,使得程序能够在等待事件的同时继续执行其他任务,从而提高系统的响应速度。 最后,硬件电路的设计和环境可能也会影响程序的运行速度。如果硬件电路不稳定或与程序需求不匹配,可能会导致信号传输的延迟或丢失,从而影响程序的运行速度。此时可以通过检查硬件电路的连线、电源供应和噪声等方面,以及在环境允许的情况下,采取屏蔽措施来解决这些问题。 综上所述,要提高STM32程序的运行速度,需要优化算法和代码,合理利用系统资源,优化阻塞操作,并确保硬件电路的稳定性和适配性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值