C语言关键字之volatile

volatile关键字是用来防止编译器在编译时对所修饰的变量做优化,例如:

unsigned char reg1;   // Hardware Register #1
unsigned char reg2;   // Hardware Register #2

void func (void)
{
  while (reg1 & 0x01)   // Repeat while bit 0 is set
  {
    reg2 = 0x00;        // Toggle bit 7
    reg2 = 0x80;
  }
}
上面代码中定义了两个变量reg1和reg2,这两个变量用于访问硬件寄存器。我们的本意是,当reg1对应的寄存器的最后一个bit为1时,先向寄存器reg2写0x00,再向reg2写0x80,这样不断地循环,直到最后一个寄存器的bit1为0。

这里写图片描述

在大多数情况下,在while循环中,编译器只读取一次寄存器的状态并赋值给reg1,这样reg1的值会保持不变,即使reg1对应的寄存器的状态发生了变化。另外,代码中对reg2进行了两次赋值操作,编译器往往会把前面的赋值优化掉,只保留最后一个赋值操作。经过编译后,该程序的作用变成了: 

这里写图片描述

然而这些优化操作不是我们所期望的,这时候volatile横空出世,生来就是为了解决这一问题的,它阻止了编译器对其修饰的变量做优化,让编译后的程序达到我们想要的功能。我们看一下修改后的代码:

volatile unsigned char reg1;   // Hardware Register #1
volatile unsigned char reg2;   // Hardware Register #2
void func (void)
{
 while (reg1 & 0x01)   // Repeat while bit 0 is set  
 {
  reg2 = 0x00;        // Toggle bit 7  
  reg2 = 0x80;  
 }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值