我想知道在以下情况下,临时的 volatile 修饰符是否会产生正确的行为。假设ISR收集数组中的值,并且一旦收集到足够的值,便表示已准备就绪。

int array[10]; // observe no volatile here
int idx = 0;   // neither here
volatile bool ready = false; // but here

这是ISR是伪代码
ISR() {
  if (idx < 10)
     array[idx++] = ...;
  ready = (idx >= 10);
}

假设我们可以保证,即在发出 array信号后,仅通过读取ready,并且通过特定的方法访问元素:
int read(int idx) {
  // temporary volatile semantics
  volatile int *e = (volatile int*)(array + idx);
  return *e;
}

根据cpp-reference,这似乎是允许的



为了完整起见,主例程执行以下操作
void loop() {
   if (ready) {
     int val = read(0); // Read value
     // do something with val.
   }
}

在这种情况下,我应该期望从array读取正确的值,还是在保证从ISR()内部写入数组实际上在RAM中执行所需的数组元素上易变?

注意Why is volatile needed in C?没有详细说明在这种特殊情况下是否需要使用volatile。

最佳答案

并非通过array[]写入volatile,因此您不能依赖于这种可观察到的行为。是的,编译器必须发布array的非缓存读取,但这只是图片的一半。

您所谈论的顺序似乎受volatile影响-并非如此。

关于c++ - 使用临时 volatile 限定符优化共享阵列访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40301542/

10-15 16:39