Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不设置此变量?_C_Microcontroller_Long Integer_Volatile - Fatal编程技术网

C 为什么不设置此变量?

C 为什么不设置此变量?,c,microcontroller,long-integer,volatile,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); ...

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

通常
volatile
用于表示变量可以在正常控制流之外更改,例如在ISR中。但听起来您只是在ISRs中读取角度,而不是设置角度

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


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

角度不应该定义为无符号长形吗?结果值将在0-36000范围内,其他地方使用的是无符号整数。据我所知,这些可以隐式转换。这正是volatile的用途。如果没有它,循环可以被优化。
average_period
是如何设置的?为什么可以被优化掉呢?循环中还有其他以类似方式计算的值,并且在代码中的其他中断中使用角度。或者只需使用两个#pragma语句来关闭围绕“角度”值设置的优化。“如果你想避免使用锤子,你可以用砖头或木头钉钉子。“
volatile
是作业的错误工具。OP需要向编译器发出信号,表明主循环中设置的
angle
值在其他地方使用,无法优化
volatile
并没有这样说,它说
angle
可以以编译器无法预料的方式进行更改。正如OP所说,这将强制生成防御代码,并将代码增加2倍。每一次访问都将获得一条额外的“加载”指令,甚至是同一ISR中的背对背线路。如果此代码仅在后台循环中设置VAR并在ISR中读取,则完全不需要这些额外的负载,并且可能会影响计时。