我想知道在下面的场景中,临时的易失性限定符是否会产生正确的行为。假设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);
}假设我们可以保证在发送 ready信号并通过特定的方法( only )访问元素之后,只读取
int read(int idx) {
// temporary volatile semantics
volatile int *e = (volatile int*)(array + idx);
return *e;
}根据cpp-参考的说法这似乎是允许的
将非易失性值转换为易失性类型没有任何影响.若要使用易失性语义访问非易失性对象,必须将其地址转换为易失性指针,然后必须通过该指针进行访问。
为了完整起见,主例程执行以下操作
void loop() {
if (ready) {
int val = read(0); // Read value
// do something with val.
}
}在这种情况下,我应该期望从array读取正确的值还是在需要的数组元素上是易失性的,以确保从ISR()内部写入数组实际上是在RAM中执行的呢?
请注意,为什么C中需要易失性?没有详细说明在这种特殊情况下是否需要易失性。
发布于 2016-10-28 09:16:13
将写到array[]并不是通过volatile,所以您不能依赖于这种可观察的行为。是的,编译器必须发出array的非缓存读取,但这只是图片的一半。
你说的是秩序,就好像它受到了volatile的影响--它不是。
https://stackoverflow.com/questions/40301542
复制相似问题