硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2118|回复: 9
收起左侧

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

[复制链接]

6

主题

130

回帖

148

积分

初级会员

积分
148
发表于 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;
但是这样代码看起来特别的怪。

be_optimized.jpg

config.jpg

回复

使用道具 举报

0

主题

43

回帖

43

积分

新手上路

积分
43
发表于 2022-11-28 17:36:08 | 显示全部楼层
do{}while(0)
回复

使用道具 举报

75

主题

683

回帖

908

积分

金牌会员

积分
908
发表于 2022-11-28 18:06:39 | 显示全部楼层
这种应该是不会被优化的把。你都实际使用了。
回复

使用道具 举报

6

主题

130

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-11-28 18:33:07 | 显示全部楼层
本帖最后由 cjunrong 于 2022-11-28 18:39 编辑

这个没用,直接被编译器忽略
回复

使用道具 举报

6

主题

130

回帖

148

积分

初级会员

积分
148
 楼主| 发表于 2022-11-28 18:36:31 | 显示全部楼层
庄永 发表于 2022-11-28 18:06
这种应该是不会被优化的把。你都实际使用了。

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2022-11-29 00:19:42 | 显示全部楼层
MDK的调试设置非常受到优化等级的影响,以楼主位的代码为例,实际上这个地方是没有被优化,是MDK调试状态展示的有问题,他把这部分直接忽略掉了。

看左侧的灰色栏并不靠谱

image.png

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

__asm("BKPT 0")


回复

使用道具 举报

210

主题

1042

回帖

1682

积分

至尊会员

More we do, more we can do.

积分
1682
发表于 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.
回复

使用道具 举报

6

主题

130

回帖

148

积分

初级会员

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

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

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-1-24 09:59:50 | 显示全部楼层
eric2013 发表于 2022-11-29 00:19
MDK的调试设置非常受到优化等级的影响,以楼主位的代码为例,实际上这个地方是没有被优化,是MDK调试状态展 ...

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

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-24 11:36:39 | 显示全部楼层
AC6的编译之所以高效,是因为他完全根据自己编程方法编译, 只要是结果跟你代码的保持一致, 中间过程根本不会考虑你代码的顺序及方法。
特别是if else更是被优化的重点对象。
你要是真的想全程查看局部变量,就把你要看的局部变量暂时改成static 的全局变量, 查错完成后还原。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 21:29 , Processed in 0.270222 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表