打印
[GUI]

STM32CUBEIDE编译优化的问题

[复制链接]
2214|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvluoo|  楼主 | 2025-3-5 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我设置了优化选项为-O2,其他所有属性和参数都保持默认值。在我的代码中有一个循环,循环中有26跳数据,但是测试中似乎从14条变化到26条不等,多次测试这种变化仅仅取决于编译的时间点。编译器在优化选项为-O2时是否有某种随机性?如何选择优化等级?

使用特权

评论回复
沙发
公羊子丹| | 2025-3-6 07:39 | 只看该作者
这个问题可能跟编译器的指令调度或者寄存器分配优化有关,你试过换成 -O1 或者 -O3 看看结果会不会稳定吗?

使用特权

评论回复
板凳
周半梅| | 2025-3-6 07:41 | 只看该作者
-O2 主要是优化执行速度,但有时候会导致代码行为不稳定,尤其是循环展开或者指令重排,试试加 volatile 关键字看看?

使用特权

评论回复
地板
帛灿灿| | 2025-3-6 07:42 | 只看该作者
你这个循环有没有用 volatile 修饰相关变量?如果没有的话,编译器可能会优化掉一些代码,导致执行结果不一致。

使用特权

评论回复
5
童雨竹| | 2025-3-6 07:43 | 只看该作者
这种情况可能跟 -O2 的指令重排或者自动循环展开有关,可以尝试 -Og 或者 -O1 看是否稳定。

使用特权

评论回复
6
万图| | 2025-3-6 07:44 | 只看该作者
试过 -O3 吗?有些时候 -O3 可能比 -O2 更激进,但也可能带来更一致的优化结果。

使用特权

评论回复
7
Wordsworth| | 2025-3-6 07:46 | 只看该作者
你是用的 gcc 还是 armclang?不同编译器的优化策略可能会有所不同,可以看看编译器的优化日志。

使用特权

评论回复
8
Bblythe| | 2025-3-6 07:47 | 只看该作者
如果优化导致行为不确定,建议尝试 -fno-strict-aliasing 或者 -fno-tree-vectorize,看看是否能改善稳定性。

使用特权

评论回复
9
Pulitzer| | 2025-3-6 07:48 | 只看该作者
编译优化不会真正“随机”,但确实受编译时间点影响,可能和代码布局、链接顺序有关,可以试试加 -fno-ipa-cp 之类的参数限制优化。

使用特权

评论回复
10
Uriah| | 2025-3-6 07:49 | 只看该作者
你可以在编译选项里加 -fdump-tree-all,看看 -O2 具体做了哪些优化,分析下是哪个优化阶段导致了这个问题。

使用特权

评论回复
11
Clyde011| | 2025-3-6 07:50 | 只看该作者
这个问题可能跟 -O2 的 loop unrolling 相关,试试 -fno-unroll-loops 看看优化后的代码是否更稳定?

使用特权

评论回复
12
她已醉| | 2025-3-8 01:26 | 只看该作者
编译器在优化选项为 -O2 时不会引入随机性。你所观察到的循环中数据条数的变化可能是由于未定义行为导致,比如说,如果代码中存在未定义行为(如数组越界、未初始化变量、指针错误等),优化后的代码可能会表现出不一致的行为

使用特权

评论回复
13
失物招領| | 2025-3-8 02:29 | 只看该作者
一般可以使用静态分析工具(如cppcheck)或编译器警告(-Wall -Wextra)检查代码

使用特权

评论回复
14
将爱藏于深海| | 2025-3-8 03:29 | 只看该作者
启用地址消毒剂(AddressSanitizer)或未定义行为消毒剂(UBSan)进行调试

使用特权

评论回复
15
春日负喧| | 2025-3-8 04:37 | 只看该作者
如果代码是多线程的,且未正确同步共享数据,可能会导致数据竞争,从而表现出不一致的行为

使用特权

评论回复
16
温室雏菊| | 2025-3-8 05:32 | 只看该作者
编译器优化可能会改变代码的执行顺序或删除某些看似无用的代码,从而导致行为变化

使用特权

评论回复
17
白马过平川| | 2025-3-8 06:28 | 只看该作者
使用volatile关键字标记可能被优化的变量

使用特权

评论回复
18
故意相遇| | 2025-3-8 07:27 | 只看该作者
检查编译器生成的汇编代码,确认优化是否导致了意外的行为

使用特权

评论回复
19
风凉| | 2025-3-8 08:29 | 只看该作者
如果代码依赖于硬件状态(如定时器、中断、外设寄存器),硬件的不稳定性或外部干扰可能导致行为变化

使用特权

评论回复
20
西洲| | 2025-3-8 09:39 | 只看该作者
调试阶段建议使用-O0-Og,确保代码行为可预测且易于调试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

48

帖子

0

粉丝