我有一个数组。 我在主程序中使用它。 我在ISR中使用它。 我是否必须始终将其定义为易失性? 编译器可以对我的数组应用什么优化?
答案 0 :(得分:2)
如果您声明int
,然后再读两次,编译器就可以记住'第一次阅读,而不是再次阅读它。
static int value = 0;
void ISR() {
++value;
} // ISR()
int main() {
while (value==0) {
// Do nothing
} // while
} // main()
编译器可以读取value
一次,然后一遍又一遍地测试它,始终为零! ISR改变它,但编译器没有"看到"那种变化。
如果您将value
标记为volatile
,那么编译器将始终读取它:它永远不会记住它:
static volatile int value = 0;
如果它是一个数组并不重要:可能会发生同样的问题。
static volatile int array[256];