使用临时volatile限定符

时间:2016-10-28 08:58:52

标签: c++ c compiler-optimization volatile isr

我想知道在以下情况下,临时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只读 <{strong> ready,并且通过特定方法访问元素仅

int read(int idx) {
  // temporary volatile semantics
  volatile int *e = (volatile int*)(array + idx);
  return *e;
}
根据{{​​3}}

似乎允许

  

对易失性类型的非易失性值的强制转换无效。要使用volatile语义访问非易失性对象,必须将其地址强制转换为指向易失性的指针,然后必须通过该指针进行访问。

为了完整性,主程序执行以下操作

void loop() {
   if (ready) {
     int val = read(0); // Read value 
     // do something with val.
   }
}

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

请注意cpp-reference没有详细说明是否需要在此特殊情况下使用volatile。

1 个答案:

答案 0 :(得分:1)

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

您正在谈论订单,好像受到volatile的影响 - 它不是。