标签存档: volatile

使用volatile的重要性

volatile关键字的作用之前已经进行了总结,但是有时候还是会忘记使用,今天记录一下忘记使用后遇到的后果。

如下代码:
Num = 0;
while(Num < 2000)
{
……
}
其中Num在定时器中断中自加,代码的本意是当Num小于2000时执行循环体。
使用的开发环境IAR EW8051 8.1
当不进行代码优化是,代码工作很正常,当使用优化等级high时,while循环无法退出!

原因就不再赘述了,做个记录,警醒自己!

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);
}

再会 volatile 关键字——the order of volatile accesses is undefined

1.问题描述:
在编译代码时出现以下警告。
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

警告处代码如下:
if ((TAR+CcrCont) > TACCR0)
{
return FALSE;
}

警告的意思大体是说,对 volatile 的访问没有被定义。

2.问题分析: 继续阅读 »

volatile关键字

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
关键在于两个地方:
1. 编译器的优化 (请高手帮我看看下面的理解)
在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;
当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致
当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致
当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致 继续阅读 »