c语言程序的范围是什么意思?

时间:2018-03-24 17:57:00

标签: c volatile

在声明volatile关键字时,变量的值会在程序范围之外的任何时刻发生变化。这是什么意思?是否会在主要功能范围之外或在全局声明功能范围之外进行更改?如果同时执行两个或多个事件,那么嵌入式系统的观点是什么?

2 个答案:

答案 0 :(得分:1)

volatile最初用于从内存映射硬件设备读取等内容;每次从映射到串行端口的内存地址读取时,它可能会有一个新值,即使程序中没有任何内容写入它。 volatile清楚地表明那里的数据可能随时发生变化,因此每次都应重新读取,而不是允许编译器在知道程序永远不会更改它时将其优化为单个读取。即使没有硬件干扰也可能发生类似情况;异步内核回调可能以类似的方式写回用户模式内存,因此有时需要每次重新读取值。

答案 1 :(得分:0)

Ab优化编译器假设只有单个执行线程的上下文。另一个上下文意味着编译器无法同时看到的任何事情。所以这是硬件操作,中断处理程序或其他线程或进程。在您的代码访问全局(程序或文件级别)变量的情况下,优化器不会假设另一个上下文可能会更改或读取它,除非您使用volatile限定符告诉它。

以内存映射的硬件寄存器为例,读取while循环,等待它更改。如果没有volatile,编译器只会看到你的while循环读取寄存器,如果你允许编译器优化代码,它将优化掉多次读取,永远不会看到寄存器的变化。这就是我们通常希望优化编译器处理在循环中不会改变的变量。

您写入的内存映射硬件寄存器也会发生类似的情况。如果您的程序从不从它们读取,编译器可以优化掉写入。同样,当您不处理硬件或其他上下文使用的内存位置时,这是您希望优化编译器执行的操作。

中断处理程序和分叉线程的处理方式与硬件相同。除非您使用volatile,否则优化器不会假设它们同时运行并跳过优化加载或存储到共享内存位置。

相关问题