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

What do they mean by scope of the program in c language?

在声明 volatile 关键字时,变量的值会在程序范围之外随时更改。那是什么意思?它是否会在main函数范围之外或全局声明函数范围之外发生变化?如果同时执行两个或多个事件,从嵌入式系统的角度来看是什么?

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

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

以内存映射的硬件寄存器为例,您在 while 循环中读取数据以等待它发生变化。如果没有 volatile ,编译器只会看到您的 while 循环读取寄存器,如果您允许编译器优化代码,它将优化多次读取并且永远不会看到寄存器中的变化。这就是我们通常希望优化编译器对循环中不改变的变量所做的事情。

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

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