【发布时间】:2017-01-11 16:24:56
【问题描述】:
这里,
我的源代码
OCR0A=30;
uint16_t start=TCNT1;
uint16_t w;
for(uint8_t i=0;i<6;i++){
pwm=pgm_read_byte(&forward[i]); // mark here
// delay
do{
w=TCNT1;
} while(w-start>300);
}
OCR0A=127;
编译它,查看asm,我发现我的代码的业务被改变了。它变成了像下面这样的其他东西
OCR0A=30;
uint16_t start=TCNT1;
uint16_t w;
for(uint8_t i=0;i<6;i++){
// delay
do{
w=TCNT1;
} while(w-start>300);
}
pwm=pgm_read_byte(&forward[5]); // mark here
OCR0A=127;
注意“在此处标记”行。
在我的原始代码中。 pwm 应该被定时器溢出中断使用。第二个代码并不是真正由编译器生成的。我写它只是为了方便描述
有什么建议吗? 谢谢
【问题讨论】:
-
恕我直言,GCC 会选择将您的读取推送到 for 循环之外,这非常奇怪。可能想发布更多您的代码,以便我们对此做出正确判断。我知道 AVR-GCC 可以做一些时髦的事情,但并非完全没有理由,但如果我们了解更多上下文,这个小例子可能会变得更容易理解。
-
我发布的显示问题的代码不是真实的。我只是编的。为什么编译器会产生不同的东西?不会工作。
-
也许您误读了程序集?除非您将汇编与验证结论所需的任何其他内容一起显示,否则没有人可以验证。
-
如果您可以发布更多的程序集,我们可以更轻松地揭穿这一点。 (如果您不想用汇编代码完全阻塞问题,您可以使用 pastebin 或其他东西(我不确定代码发布替代方案)。
-
编译器认为
for语句对于变量pwm是无用的。刚刚分配了最终值forward[5]