调试时变量窗口的值与程序运行的值不同的一种可能解决方案
一个例子
while (!ready_to_receive)
{
}
假设本来ready_to_receive
为false
。后来我在中断中将ready_to_receive
变为true
。此时我可以从变量窗口看到,ready_to_receive
为true
,但是程序还是在死循环中,即运训这一段代码时,用的ready_to_receive
还是为false
。
长话短说
请尝试用volatile
修饰这个变量
一个可能原因1
ready_to_receive
这个变量对应的值有两个来源:一个是实际的地址(比如RAM),另一个是在寄存器或者cache里面。由于在寄存器或者cache里面的值能更快的取出来,程序在优化的时候,很可能就使用了寄存器或者cache里面的值。
这样,就算在RAM里面的值被修改了,只要寄存器里的值没有被修改,变量在运行时采用的值可能就不会被修改。
这也是为什么采用volatile
的原因。volatile
要求编译器在优化时,每次用到这个变量的值,都从实际地址存储器中读取。这对于一个需要共享的变量资源来说非常重要。
《程序设计教程》周纯杰编著 ↩︎