没有合适的资源?快使用搜索试试~ 我知道了~
关于C语言中volatile关键字
需积分: 50 13 下载量 154 浏览量
2013-08-20
06:30:20
上传
评论 2
收藏 39KB DOC 举报
温馨提示
试读
3页
volatile详解 一、volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
资源推荐
资源详情
资源评论
关于 C 语言中 volatile 关键字
volatile 详解
一、volatile 的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般
都会作减少存取内存的优化,但有可能会读脏数据。当要求使用 volatile 声明变量值的时
候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。
精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化
从而可以提供对特殊地址的稳定访问;如果不使用 valatile,则编译器将对所声明的语句
进行优化。(简洁的说就是:volatile 关键词影响编译器编译的结果,用 volatile 声明的
变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出
错)
二、看两个事例
1、告诉 compiler 不能做任何优化
比如要往某一地址送两指令
int *ip =...; //设备地址
*ip = 1; //第一个指令
*ip = 2; //第二个指令
以上程序 compiler 可能做优化而成
int *ip = ...;
*ip = 2;
结果第一个指令丢失。如果用 volatile, compiler 就不允许做任何的优化,从而保证
程序的原意
volatile int *ip = ...;
*ip = 1;
*ip = 2;
即使你要 compiler 做优化,它也不会把两次付值语句间化为一。它只能做其它的优化。
2、用 volatile 定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用
放在 cache 或寄存器中的备份。
例如:
volatile char a;
a=0;
while(!a){
//do some things;
}
doother();
如果没有 volatile doother()不会被执行
三、下面是使用 volatile 变量的几个场景
1、中断服务程序中修改的供其它程序检测的变量需要加 volatile
例如:
static int i=0;
int main(void)
{
...
while(1)
资源评论
叶兆萍
- 粉丝: 5
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功