volatile有什么用?

        volatile的本意是“易变的”因为访问寄存器要比访问内存单元快得多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。

        当要求使用volatile声明变量值的时候,编译器对访问该变量的代码就不再进行优化,系统总是重新从它所在的内存读取数据。

volatile一般用在以下三种地方:

中断服务程序中 修改的 供其它程序检测的 变量 需要加volatile

volatile int i = 0;
 
int main(void) 
{
    while (1)
    { 
        if(i) 
            do_something(); 
    } 
}


/* 中断处理函数 */ 
void ISR_2(void) 
{ 
    i = 1; 
}

程序的本意是希望ISR_2中断产生时,在main函数中调用do_something函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该是volatile int i;

多任务环境下(如多线程)各任务间共享的标志应该加volatile; 

外设寄存器地址映射,例如:把寄存器的地址映射到0xff800000

int *output = (unsigned int *)0xff800000;//定义一个IO端口;

int init(void) 
{ 
    int i; 
    for(i=0; i<10; i++)
    { 
        *output = i; 
    }
}

经过编译器优化后,编译器认为前面循环半天都是废话,对最后的结果毫无影响,因为最终只是将output这个指针赋值为9,所以编译器最后给你编译编译的代码结果相当于:

int init(void) 
{ 
    *output = 9; 
}
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值