1

我对微控制器的一些 C 代码有疑问。这似乎是语言或编译器问题,但程序编译得很好。然而,当在微控制器上运行时,问题就显现出来了。

(这是针对 Atmel AVR AtTiny26 的。)

我正在从模数转换器读取一个值并将其乘以 10:

int SD;
SD = ADCH * 10;

这不能正常工作。我认为在计算中尝试从 ADC 读取是问题所在,所以我尝试了:

int SD;
SD = ADCH;
SD = SD * 10;

这也不起作用,导致微观不稳定。(只要模拟值低,它就可以工作,但是一旦达到某个值,就永远不会再次从 ADC 获得值,直到复位。)

这似乎有效:

int SD;
int TEMP;
TEMP = ADCH;
SD = TEMP * 10;

引入另一个变量可以解决问题,但似乎令人困惑。这是怎么回事?

关于 EE 的相关问题:https ://electronics.stackexchange.com/q/38404/2028

编辑:

这可能与编译优化有关。当我在编译时在命令行上指定 -Os 与 -O2 或 -O3 时,会得到不同的结果。优化能否改变这种变量分配的工作方式?

4

1 回答 1

0

您必须声明SDvolatile

volatile int SD;

这意味着寄存器的值可能会被硬件改变(不受编译器控制)。在您的情况下, 的值ADCH可能会被硬件更改,因此,通过设置SDas volatile,您将强制编译器在使用它之前再次读取(更新)它。

于 2012-12-23T22:44:18.450 回答