【发布时间】:2014-08-26 00:27:40
【问题描述】:
我正在编写一段代码,该代码根据时间数据计算一些值。它在微控制器 (TI MSP430) 上运行
我遇到了不寻常的行为,因为变量似乎永远不会被赋值。
unsigned int angle = 0;
unsigned long int average_period;
void main(void){
...
while (1){
....
angle = ((2359325536UL)/average_period);
...
}
}
在这段代码中,我有一个全局变量 angle(它需要是全局变量,因为它在中断中被访问)并且它在我的程序的主循环中重复计算和设置。
但是它的值永远不会改变,如果我将角度设置为其他任意值,它会保持该值,所以它不像计算输出零。
如果我使角度不稳定,它可以正常工作,尽管我的代码大小从(3kB 到 7.5kB)翻了一番。什么会导致这种情况,如果不使用 volatile 关键字可以避免这种情况。
注意:我对 volatile 关键字不是很熟悉,除了它可以用来防止未使用的变量被优化。
【问题讨论】:
-
不应将角度定义为
unsigned long? -
结果值将在 0-36000 左右的范围内,并且在其他地方使用无符号整数。我的理解是这些可以隐式转换。
-
这正是 volatile 的用途。没有它,循环可以被优化掉
-
average_period是如何设置的? -
为什么可以优化掉,在循环中还有其他类似的值计算,并且在代码中的其他中断中使用了角度。
标签: c microcontroller long-integer volatile