博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Volatile相关知识
阅读量:6983 次
发布时间:2019-06-27

本文共 1337 字,大约阅读时间需要 4 分钟。

Volatile相关知识

区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。
volatile的作用   
volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,要求每次直接读值.非常典型的就是寄存器的值可能被人为的从硬件上改变,所以必须要求 要求每次直接读值。   
简单地说就是防止编译器对代码进行优化.比如如下程序:   XBYTE[2]=0x55;   XBYTE[2]=0x56;   XBYTE[2]=0x57;   XBYTE[2]=0x58;   如果对外部硬件上述四条语句分别表示不同的操作,会产生四种不同的动作,那么编译器就不能像对待纯粹的程序那样对上述四条语句进行优化只认为XBYTE[2]=0x58,而忽略前三条语句,并且只产生1条机器码。如果XBYTE用volatileo修饰过,此时编译器会逐一的进行编译并产生相应的4条机器码。
 
再详细解释一下:   推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)   
3). 多线程应用中被几个任务共享的变量
面试中可能会提问到volatile的相关知识:   
1). 一个参数既可以是const还可以是volatile吗?解释为什么。   
2). 一个指针可以是volatile 吗?解释为什么。   
3). 下面的函数有什么错误:   
int square(volatile int *ptr)   
{   
return *ptr * *ptr;   
}   
下面是答案:   
1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。   
2). 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修改一个指向一个buffer的指针时。   
3). 这段代码是个恶作剧。
这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:   
i
nt square(volatile int *ptr)   
{   
int a,b;   
a = *ptr;   
b = *ptr;   
return a * b;   
}   
由于*ptr的值可能被意想不到地改变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:   
long square(volatile int *ptr)   
{   
int a;   
a = *ptr;   
return a * a;   
}

转载地址:http://qivpl.baihongyu.com/

你可能感兴趣的文章
【poi xlsx报错】使用POI创建xlsx无法打开
查看>>
UNIX环境高级编程笔记之文件I/O
查看>>
DIV+CSS规范命名
查看>>
4G U盘版64位bitcoin专用挖矿操作系统
查看>>
我的2013 Q.E.D
查看>>
2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】...
查看>>
4.5. Rspamd
查看>>
超级简单:在你的ASP.NET页面自定义列表和分页
查看>>
(原创)INTERVAL分区表与RANGE分区表相互转化
查看>>
ArcMap中的名称冲突问题
查看>>
(转) 一张图解AlphaGo原理及弱点
查看>>
AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行
查看>>
美联邦调查局 FBI 网站被黑,数千特工信息泄露
查看>>
掉电引起的ORA-1172错误解决过程(二)
查看>>
在网站建设过程中主要在哪几个方面为后期的网站优打好根基?
查看>>
【MOS】RAC 环境中最常见的 5 个数据库和/或实例性能问题 (文档 ID 1602076.1)
查看>>
新年图书整理和相关的产品
查看>>
Struts2的核心文件
查看>>
Spring Boot集成Jasypt安全框架
查看>>
GIS基础软件及操作(十)
查看>>