有个疑问,为什么MRS编译器很喜欢把变量优化掉?

image.png

比如这个g_ucbDataReceivedFlag变量,在程序里当作标志,有正常使用,但是这种情况下就被优化掉了,除非加了

volatile关键字,所以有个疑问就是,编译器什么情况下会优化掉变量?如何来规避这个问题?这种很容易导致出问题不好排查。

觉得有一丝丝觉得该加 volatile的地方,我就加上。


有种盲猜的感觉,volatile也不能滥用,应该要清晰的知道什么时候会被优化掉。


您好,MRS默认启用的是Os的优化级别,会启用大量优化pass来减少代码尺寸,如果您没有这个需求可以改变为O0。

另volatile关键字单片机程序中一般可用于只在中断中改变全局变量标志,强制从内存读取变量或寄存器,循环标志等时使用。



看上去这是个全局变量。那么,除非开了 -flto,否则不可能被优化掉。

当然,要是你访问这个变量的代码,整体都没被调用,那就当我没说好了。


程序中有使用,默认的Os优化级别,没开flto。

image.png


不想让编译器优化的变量要加volatile,这个是C语言开发常识。


只有登录才能回复,可以选择微信账号登录