Volatile关键词

volatile 英文意思“挥发,挥发物,易变的”。

意思是这个关键词修饰的变量是易变的,提示编译器不要优化它(优化从Cache中取数据),而从它原始的地方拿数据。

volatile关键词注意的地方主要是:

1、中断服务程序中修改过,而其它程序也需要用到的变量需要加volatile;
2、多任务环境下各任务间共享的变量应该加volatile,如信号量等;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

static volatile U32   trapValue1    = TRAP_VALUE_1;

static volatile U32   trapValue2    = TRAP_VALUE_2;

……

  while (trapValue1 != TRAP_VALUE_1 || trapValue2 != TRAP_VALUE_2) {
    sysPrintf("trapped!/n");
    }

在一段程序中设置trap检查,……中的程序没有改动过着两个TRAP_VALUE_1和TRAP_VALUE_2,但是如果发生了陷入,则可能改动这两个值,可以用来检查是否程序运行正常。

 

1情况:

volatile int changableValue=1;

int main(){

(1)

int b=changeableValue*2;//(2)

}

在(1)处发生中断:

int_sr(){

changableValue=0;

}

如果不加volatile则b=1*2=2; 如果加了volatile则 b=0*2=0。

如果不加volatile但是想防止,就应该在(2)前面关中断,在(2)执行完后开中断。

-------------------------------------------------------------------------

2情况:

task A如下

volatile int  shareSamp=1;

int main()

{

         if(shareSamp)

                    print("1");

       else

                 print("0");

}

task B 如下

extern volatile int shareSamp;

int main()

{

        shareSamp=0;

}

如果taskB先执行,不加Volatile 则为1,;加了的话则为0。

----------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值