C语言之volatile关键字具体用法求指导~~~

2019-12-20 21:36发布

本帖最后由 擦鞋匠 于 2017-7-4 16:56 编辑

额,网上也看了很多介绍如何使用volatile关键字的文章,但还是感觉有些似懂非懂,不知该如何下手("最熟悉的陌生人...")~~~

问题1: 什么情况下应该使用volatile关键字?

个人理解:volatile关键字专门是针对硬件寄存器而设定的,如下两个例子:

1>多次去读取单片机的某个标志位(这个标志位可能会被读取后由硬件自动清除),

2>多次去读取gpio的toggle寄存器(该寄存器读取后可能会被取反).

在这两种情况下,当然需要防止编译器对变量的优化,但是如果是一个纯粹的内存变量(非寄存器),我想不出,为什么一定要使用volatile关键字?恳请大神指导~~~

例如,如下是freertos中的源码,为何需要使用volatile关键字?

搜狗截图20170704165421.png (65.32 KB, 下载次数: 0) 下载附件 2017-7-4 16:56 上传

问题2: 如下两种方式在哪种使用volatile关键字方式更加合适?还是说根本就没有区别???恳请大神指教~~~

方式1: 在定义数据类型时使用volatile关键字修饰.

方式2: 在定义函数时对形参变量使用volatile关键字进行修饰.

  1. //方式1:
  2. volatile uint32_t SysVal;

  3. //方式2:假设SysVal只通过该形参变量传递值
  4. //当然,全局变量并非一定要使用形参进行传递,这里纯粹是为了讨论volatile放在哪里最合适
  5. void func(volatile uint32_t val)
  6. {
  7.         //...
  8. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
25条回答
liuqian
1楼-- · 2019-12-22 16:00
 精彩回答 2  元偷偷看……
chenchaoting
2楼-- · 2019-12-22 20:10
ibichao 发表于 2017-7-4 20:01
严谨的来说需要,因为中断会打断程序流程,
假如中断里改变了变量后,在其他地方引用了该变量,
编译器是 ...

这样不管优不优化,都是不正确的值呀
ibichao
3楼-- · 2019-12-22 21:46
chenchaoting 发表于 2017-7-5 23:02
这样不管优不优化,都是不正确的值呀

引用这种变量之前可以关中断
helislayer
4楼-- · 2019-12-22 22:07
volatile 其实没有那么复杂。

要了解 volatile 需要知道一些编译器是如何工作的。
所有的内存变量,都是需要加载到寄存器来工作的。
这个有个特定的边界就是内存的加载, memory load/ memory store。
这个 memory load/store 通常是比 CPU 要慢很多的。

编译器通常在相同变量的多次内存 load 会假定这个部分的内存
没有其他人写。所以会把多个相同的 mem load 合并成一个。

例如:
a  = b*2 + b*b;
这里面 b 出现了 3 次。不优化的结果是有 3 个 memory load。
优化的结果就是等价于这样:
int register temp = *(&b);
*(&a) = temp * 2 + temp * temp;

volatile 就是告诉编译器,这个内存变量还有其他代码(中断/线程)
会访问,所以禁止做 memory load/ memory store 的优化。就是
这么简单。

有多少个 memory load 和 memory store 就老老实实给我再现出来。

其他在什么地方需要用 volatile 都是根据这个原则来推敲出来的。
需要用 volatile 的地方多了去了。

另外 volatile 是比较老的暴力的用法,就是 0/1 开关。要么有
优化要么没有。
新的编译器允许制定更加详细的内存 load/store 的优化。
memory barrier 这些。
gonboy
5楼-- · 2019-12-23 00:30
volatile 就是不优化。
你要向知道怎么使用它,就要知道什么时候,变量可能被优化。

编写几个小Demo 可以自己测试下。
例如常见的:
int cnt ;
cnt = 0;
for(i=0; i < 10000; i++)
{
    cnt++;
}
security
6楼-- · 2019-12-23 03:04
 精彩回答 2  元偷偷看……

一周热门 更多>