您仍然需要标记您的变量volatile:由于优化器可以自由地内联您的函数,尤其是短函数,因此在没有volatile用于访问硬件修改内存的标记的循环中调用函数会使您在以后无法读取内存的危险最初的迭代.
...因为每次进入函数时都会读取它的值?
不,不能保证这一点."缺乏易失性错误"的问题在于编译器的优化器,不知道某个变量可以从外部源改变,改变了代码的整个含义.
所以,如果你有这个:
static int x=0;
int func (void)
{
if(x == 0)
{
return 1;
}
else
{
return 0;
}
}
interrupt void isr (void)
{
x = SOMETHING;
}
Run Code Online (Sandbox Code Playgroud)
然后编译器会思考:"嗯,x永远不会被修改,因为"isr"永远不会从程序中调用.所以x总是0,我会优化代码:
int func (void)
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
然后,也许,它将内联整个功能.这种情况是否发生无关紧要,因为代码的含义在之前的优化步骤中已被破坏.
与中断(或线程,或DMA,或硬件寄存器或回调函数)共享的任何变量必须始终声明为volatile.