【发布时间】:2016-10-24 08:57:59
【问题描述】:
#include <avr/io.h>
#include <avr/interrupt.h>
void delay() {
volatile uint16_t i;
for (i=1e6; i; i--);
}
int main(void) {
DDRB = 255;
/* sei(); */
while (1) {
PORTB ^= 1;
delay();
}
}
上述程序使 LED 闪烁。 sei(); 未注释它不会。我还没有启用任何中断源,数据表说它们默认都是关闭的,虽然引导加载程序(Caterina)确实使用了 TIMER1_COMPA,但它在运行我的代码之前再次将其关闭。
它似乎不可能调用未定义的中断处理程序。但我很困惑为什么它不会眨眼。
这是怎么回事?
【问题讨论】:
-
你有调试器吗?
-
要么是引导加载程序搞砸了中断,要么看门狗被配置为在中断模式下自动启动(参见熔断器)。
-
旁注:将 uint16_t 变量初始化为 1e6 似乎很有趣。
-
@teroi 由于没有(全局)非易失性变量,内存屏障不会对生成的汇编代码产生任何影响。
-
您在此处发布的代码不是问题的原因。您需要查看(或在此处为我们发布)引导加载程序以查看正在执行的操作...
标签: c microcontroller interrupt avr