Volatile关键词字

文章讲述了寄存器变量在C语言中的特性,包括其存储位置、类型限制和没有地址的特点。重点介绍了Volatile关键字的作用,防止编译器优化,尤其是在多线程和中断服务程序中的应用。提到for循环中使用volatile以避免编译器优化的示例。
摘要由CSDN通过智能技术生成

寄存器变量是直接保存在CPU寄存器中的变量
特点 : c语言编译程序会自动将寄存器变量变成自动变量(局部变量)
        受到硬件寄存器的长度限制  寄存器变量只能用 char  int 或者 指针类型
        寄存器变量没有地址,不能使用&求寄存器变量的地址
Volatile 关键字
原理作用 : 直接存储原始内存地址  当一个变量使用了Volatile那么这个变量就不会
            因为外界的因素而变化,
            主要就是  确保本条指令不会因编译器的优化而省略,且要求每次直接读值
            简单地说就是防止编译器对代码进行优化
例子说明 
XBYTE[2]=0x55;

XBYTE[2]=0x56;

XBYTE[2]=0x57;

XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,
但是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。
如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。

volatile对应的变量可能在你的程序本身不知道的情况下发生改变
比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量
你自己的程序,是无法判定何时这个变量会发生变化
还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,
通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。
对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,
而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

典型的例子
for(int i=0; i<100000; i++);
这个语句用来测试空循环的速度的
但是编译器肯定要把它优化掉,根本就不执行
如果你写成
for(volatile int i=0; i<100000; i++);
它就会执行了

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值