在微控制器编程中,使用变量说明符static volatile
的组合与单独使用static
或volatile
有什么区别呢?
在微控制器编程中,使用变量说明符static volatile
的组合与单独使用static
或volatile
有什么区别呢?
static - 在这种情况下,使变量仅在当前文件中可见。 static
对象具有静态存储期。
volatile - 这是给编译器的一个信息,表明对象可以被正常执行路径之外的某些东西改变(例如,中断例程),并保证在任何使用之前读取变量,并在每次更改后写入。 volatile(这是一个非常常见的误解)不保证其他任何事情 - 没有原子性,没有缓存一致性等等。
这里提供了很多好的答案,但没有涉及到作用域。
静态变量一旦在作用域内被初始化并稍后更改,它们将保留更改,永远不会被销毁或重新初始化,尤其是当离开作用域时。除非在代码中规定。你可以说,静态变量在其生命周期方面类似于全局变量,但只能在其自己的作用域内访问。
易挥发的部分有强制执行从RAM而不是寄存器或闪存中缓存的变量的倾向。例如,假设某个代码是在特定的优化设置下提交给编译器的。编译器不会假定除了在变量未使用或超出其作用域时清除它们之外还附加了任何其他条件。易挥发性本质上具有双重用途,要么忽略编译器为该变量提供的优化,要么不使用预获取的该变量的副本,除了RAM中的那一个。
静态易挥发的是两种行为的组合,在任何优化之外将该变量持久保存在RAM中。
应用潜在领域:
静态的:
静态变量是指一个类变量,它在所有实例之间共享。
易失性的:
易失变量是那些被读取和写入主存储器的变量。它们不会被存储在本地缓存中,总是从主存储器中获取。
例如,有两个线程使用私有易失变量private volatile int x;
。如果线程A调用write(x)并且线程B调用read(x),则两次都将从主存储器中读取和写入,而不使用线程的本地缓存。
静态易失性的:
即使静态变量是共享变量,但在不同的线程中,一个静态变量可以存在于线程的本地缓存中并具有不同的值。为了使其对所有线程一致,只需将其声明为static volatile
。这样每次它都将从主存储器中获取。
static
和volatile
已经有足够的文献解释了,例如:
在TWI接口的相关问题上,需要使用volatile
,因为修改这些变量的函数可能会从不同的中断服务处理程序中调用。如果去除volatile
,编译器将会优化代码,但不知道代码可能会被中断,这可能导致故障。