`
qjoycn
  • 浏览: 1212955 次
文章分类
社区版块
存档分类
最新评论

关键字volatile的含义及常见用法

 
阅读更多
volatile的本意是“易变的”由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

staticinti=0;

intmain(void)
{
...
while(1)
{
if(i)dosomething();
}
}

/*Interruptserviceroutine.*/
voidISR_2(void)
{
i=1;
}

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

一般说来,volatile用在如下的几个地方:

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

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另有对函数使用volatile,可搜索相关用法。
分享到:
评论

相关推荐

    C++中volatile关键字及常见的误解总结

    主要给大家介绍了关于C++中volatile关键字及常见的误解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    volatile用法.txt

    C语言常见的关键字volatile的使用以及它的两个基本用法。 1.确保本条指令不会因编译器的优化而省略 2.提醒编译器它后面所定义的变量随时都有可能改变

    C++中const、volatile、mutable使用方法小结

    没有使用过volatile和mutable两个关键字其实不算特别常用,但是我们一定要知道这个关键字有什么用,应该怎么用.首 先const的基本操作我曾经写过一篇博客:const的基本使用 现在我要说一个const操作里面比较骚的一些...

    嵌入式系统/ARM技术中的volatile在多线程中的应用

    volatile是一个关键字,用来修饰一个变量,告诉编译器在编译的时候不要对其进行优化,在操作寄存器和多线程中这种用法是最常见的。  有这样一个例子:  #include  #include  void my_func();  int? i; ...

    ASP不能打开注册表关键字错误 ‘80004005’的解决方法

     [Microsoft][ODBC Microsoft Access Driver]常见错误 不能打开注册表关键字 ‘Temporary (volatile) Jet DSN for process 0xa78 Thread 0xadc DBC 0x26a0cfc Jet’。  第一步:请设置数据库文件为可以让用户IUSR_...

    C 语言编程常见问题解答.chm

    6 什么时候应该使用volatile修饰符? 2. 7 一个变量可以同时被说明为const和volatile吗? 2. 8 什么时候应该使用const修饰符? 2. 9 浮点数比较(floating—point comparisons)的可靠性如何? 2. 10 怎样判断一个...

    精通并发与netty视频教程(2018)视频教程

    83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析 84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器详解 86_Netty自定义编解码器与TCP粘包拆包问题 87_Netty编解码器...

    精通并发与 netty 视频教程(2018)视频教程

    Netty引用计数的实现机制与自旋锁的使用技巧 82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析 84_Netty引用计数注意事项与内存泄露...

    Visual C++音频视频处理技术及工程实践(含源码2/2)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119...

    Visual C++音频视频处理技术及工程实践地址

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119...

    精通并发与netty 无加密视频

    第83讲:AtomicIntegerFieldUpdater实例演练与volatile关键字分析 第84讲:Netty引用计数注意事项与内存泄露检测方式 第85讲:Netty编解码器剖析与入站出站处理器详解 第86讲:Netty自定义编解码器与TCP粘包拆包...

    Visual C++音频视频处理技术及工程实践(分卷0)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    Visual C++ 音频/视频 处理技术及工程实践(分卷3)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    Visual C++音频视频处理技术及工程实践(分卷9)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    Visual C++音频视频处理技术及工程实践(分卷7)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    Visual C++音频视频处理技术及工程实践(分卷6)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    Visual C++音频/视频处理技术及工程实践 (分卷1)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    Visual C++音频/视频处理技术及工程实践(分卷2)

    3.2 DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107 3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119 3.3.2...

    嵌入式Linux C编程入门(第2版) PPT

    7.4.3 c语言关键字volatile 222 7.4.4 memory描述符 222 7.4.5 gcc对内嵌汇编语言的处理方式 223 本章小结 224 动手练练 224 第8章 嵌入式linux c语言基础——arm linux内核常见数据结构 225 8.1 ...

    整理后java开发全套达内学习笔记(含练习)

    volatile (关键字) 不稳定的['vɒlәtail] while (关键字) 循环语句。 当...的时候 [hwail] ORACLE_SID=oral10g\ --变局部变量 export ORACLE_SID --变全局变量 unset ORACLE_SID --卸载环境变量 ORACLE_HOME=...

Global site tag (gtag.js) - Google Analytics