cjunrong 发表于 2022-11-28 16:45:55

如何强制变量、语句或者程序块不被编译器优化

本帖最后由 cjunrong 于 2022-11-28 16:54 编辑

遇到个问题,使用 MDK AC6,如图中的代码(圈出部分),有时候会被编译器优化掉。从结果来看,是局部变量被优化,从而导致其相关的语句被优化,即使加上 volatile 声明也不起作用。

优化等级设置0时没有问题,1及以上会出现该问题。
关键是,有时候会被优化,有时候不会被优化,没能摸清楚规律。
使用AC5则一直没问题。
搞的很郁闷,请教大伙,有没有什么方式,能强制变量、语句或者程序块不被优化?
临时的处理方式是将被优化掉的变量,在定义后先执行一次没有实际意义的运算,比如:ul_tim_clock ++; ul_tim_clock = 0;
但是这样代码看起来特别的怪。





wm20031015 发表于 2022-11-28 17:36:08

do{}while(0)

庄永 发表于 2022-11-28 18:06:39

这种应该是不会被优化的把。你都实际使用了。

cjunrong 发表于 2022-11-28 18:33:07

本帖最后由 cjunrong 于 2022-11-28 18:39 编辑

wm20031015 发表于 2022-11-28 17:36
do{}while(0)
这个没用,直接被编译器忽略

cjunrong 发表于 2022-11-28 18:36:31

庄永 发表于 2022-11-28 18:06
这种应该是不会被优化的把。你都实际使用了。

理论上是,但是有时候会,偶发性的,很诡异。不改动代码的情况下,删除掉 Objects 文件夹下的所有东西,编译多几次,有概率会出现这种情况。

eric2013 发表于 2022-11-29 00:19:42

MDK的调试设置非常受到优化等级的影响,以楼主位的代码为例,实际上这个地方是没有被优化,是MDK调试状态展示的有问题,他把这部分直接忽略掉了。

看左侧的灰色栏并不靠谱



有个简单的办法可以解决,可以手动在这个地方加个软件断点来查看

__asm("BKPT 0")


emwin 发表于 2022-11-29 09:34:45

回答你标题的问题(正文是具体情况),V6不支持指定函数优化等级:
The Arm compiler 6.x does not support changing optimization options within a C-source file. Instead these must be set on a per-file basis using command-line options. If you have functions that absolutely need different optimization levels, you need to put them into different C-source files.

cjunrong 发表于 2022-11-29 11:01:46

eric2013 发表于 2022-11-29 00:19
MDK的调试设置非常受到优化等级的影响,以楼主位的代码为例,实际上这个地方是没有被优化,是MDK调试状态展 ...

试了下,确实在AC6下,调试状态中左侧灰色栏不准确,谢谢硬汉

小肚子工程师 发表于 2024-1-24 09:59:50

eric2013 发表于 2022-11-29 00:19
MDK的调试设置非常受到优化等级的影响,以楼主位的代码为例,实际上这个地方是没有被优化,是MDK调试状态展 ...

非常感谢,刚好遇到这个问题,这个方法可以验证代码是否被优化

Edmund1964 发表于 2024-1-24 11:36:39

AC6的编译之所以高效,是因为他完全根据自己编程方法编译, 只要是结果跟你代码的保持一致, 中间过程根本不会考虑你代码的顺序及方法。
特别是if else更是被优化的重点对象。
你要是真的想全程查看局部变量,就把你要看的局部变量暂时改成static 的全局变量, 查错完成后还原。
页: [1]
查看完整版本: 如何强制变量、语句或者程序块不被编译器优化