volatile与Warning[Pa082]告警

又一次说volatile的问题,在使用IAR进行STM32开发时遇到的问题,编译发现工程中有一个告警
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
出现这个告警的原因是:在某个二元操作中,使用volatile变量是编译器无法确定操作数引用的顺序。(具体函数我还是不太明白,这里是看到其他网友的给的原因。)
这个告警在我自己的工程中也遇到过,大意是volatile变量不支持该运算符。
代码大体如下:
__IO u16 sum=0;
for(i=0;i<8;i++)
{
sum += ADCPowerValue;
}
原作者吧sun定义为volatile类型其实是没有必要的,这里ADCPowerValue是寄存器的值,在使用是应该拷贝到一个普通变量中,再使用该寄存器的拷贝参与计算。

合理的写法应该是这样:
int i;
__IO u16 sum=0;
u16 Temp = 0;
for(i=0;i<8;i++)
{
Temp = ADCPowerValue;
sum += Temp;
delay_10us(1);
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注