使用临时 volatile 限定符优化共享数组访问
Optimizing shared array access with temporary volatile qualifier
我想知道在以下情况下临时的 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
发出信号后,并且元素通过特定方法访问 only:
int read(int idx) {
// temporary volatile semantics
volatile int *e = (volatile int*)(array + idx);
return *e;
}
似乎是允许的
A cast of a non-volatile value to a volatile type has no effect. To access a non-volatile object using volatile semantics, its address must be cast to a pointer-to-volatile and then the access must be made through that pointer.
为了完整起见,主例程执行以下操作
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
的非缓存读取,但这只是图片的一半。
你说的 order 就好像它受到了 volatile
的影响 - 但事实并非如此。
我想知道在以下情况下临时的 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
发出信号后,并且元素通过特定方法访问 only:
int read(int idx) {
// temporary volatile semantics
volatile int *e = (volatile int*)(array + idx);
return *e;
}
似乎是允许的
A cast of a non-volatile value to a volatile type has no effect. To access a non-volatile object using volatile semantics, its address must be cast to a pointer-to-volatile and then the access must be made through that pointer.
为了完整起见,主例程执行以下操作
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
的非缓存读取,但这只是图片的一半。
你说的 order 就好像它受到了 volatile
的影响 - 但事实并非如此。