che*_*ind 6 c c++ volatile isr compiler-optimization
我想知道在以下情况下,临时volatile限定符是否会产生正确的行为.假设ISR收集数组中的值,并且一旦收集到足够的值,它就表示准备就绪.
int array[10]; // observe no volatile here
int idx = 0; // neither here
volatile bool ready = false; // but here
Run Code Online (Sandbox Code Playgroud)
这里的ISR是伪代码
ISR() {
if (idx < 10)
array[idx++] = ...;
ready = (idx >= 10);
}
Run Code Online (Sandbox Code Playgroud)
假设我们可以保证这array将是只读后 ready发出信号,和元素是通过特定的方法来访问只:
int read(int idx) {
// temporary volatile semantics
volatile int *e = (volatile int*)(array + idx);
return *e;
}
Run Code Online (Sandbox Code Playgroud)
这似乎是根据cpp-reference允许的
向volatile类型转换非易失性值无效.要使用易失性语义访问非易失性对象,必须将其地址强制转换为指向易失性的指针,然后必须通过该指针进行访问.
为了完整起见,主程序执行以下操作
void loop() {
if (ready) {
int val = read(0); // Read value
// do something with val.
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我应该期望从array数组元素中读取正确的值还是易失性,以保证从内部写入数组ISR()实际上是在RAM中执行的?
请注意,为什么C中需要volatile?没有详细说明在这种特殊情况下是否需要挥发性.
写入不是通过,因此您不能依赖于可观察的行为。是的,编译器必须发出 的非缓存读取,但这只是图片的一半。array[]volatilearray
你谈论的秩序就好像它受到影响volatile——但事实并非如此。