为什么没有设置这个变量?

时间:2014-08-26 00:27:41

标签: c microcontroller long-integer volatile

我正在编写一段代码,根据时序数据计算一些值。它在微控制器(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关键字并不熟悉,因为它可用于防止未使用的变量被优化。

1 个答案:

答案 0 :(得分:4)

通常volatile用于表示变量可以在正常控制流之外发生变化,例如在ISR中。但听起来你只是在ISR中阅读angle,而不是设置它。

所以我的猜测是angle从未在while (1)循环之外使用,优化器假设它的值无关紧要,因此它会跳过赋值。 volatile告诉它它不能做出任何这样的假设。

为避免volatile,请尝试在循环外使用angle,或将其传递给另一个文件中定义的函数,以便编译器认为计算的值很重要。