我想知道在以下情况下,临时 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 中执行的?
请注意,为什么在 C 中需要 volatile?没有详细说明在这种特殊情况下是否需要 volatile。