我正在编写一段代码,根据时序数据计算一些值。它在微控制器(TI MSP430)上运行
我得到了不寻常的行为,因为变量似乎永远不会得到它的值。
unsigned int angle = 0;
unsigned long int average_period;
void main(void){
...
while (1){
....
angle = ((2359325536UL)/average_period);
...
}
}
在这段代码中,我有一个全局变量角度(它需要在中断时访问它是全局的),并且在我的程序的主循环中重复计算和设置。
但是它的值永远不会改变,如果我将角度设置为某个其他任意值,它将保持为该值,因此它不像计算输出零那样。
如果我使角度不稳定,它可以正常工作,尽管我的代码大小从(3kB到7.5kB)加倍。什么会导致这种情况,并且可以避免使用volatile关键字。
注意:我对volatile关键字并不熟悉,因为它可用于防止未使用的变量被优化。
答案 0 :(得分:4)
通常volatile
用于表示变量可以在正常控制流之外发生变化,例如在ISR中。但听起来你只是在ISR中阅读angle
,而不是设置它。
所以我的猜测是angle
从未在while (1)
循环之外使用,优化器假设它的值无关紧要,因此它会跳过赋值。 volatile
告诉它它不能做出任何这样的假设。
为避免volatile,请尝试在循环外使用angle
,或将其传递给另一个文件中定义的函数,以便编译器认为计算的值很重要。