为什么我的 ISR 声明会破坏我的程序?

问题描述

我正在尝试让我的 Arduino Uno R3 上的两个 LED 闪烁(用于学习目的)。我使用 avr-gcc 和 avrdude 来编译和加载我的程序。

我在 main 的 while 循环中使第一个闪烁。我正在尝试使用 Timer0 打开和关闭第二个。

首先,有效的代码

#include <avr/io.h>
#include <util/delay.h>

int main() {
    TCCR0B |= (1 << CS02) | (1 << CS00);
    TimsK0 |= (1 << TOIE0);

    DDRD = 1 << PD3;
    DDRB = 1 << PB5;
    PORTB = 0;

    while(1) {
        PORTD ^= 1 << PD3;
        _delay_ms(500);
    }
    return 0;
}

正如预期的那样,此代码使我的 LED 闪烁,并且每秒重新开始。我也在设置(但不使用)第二个 LED 和计时器。

现在,当我添加一个中断向量时,问题就开始了:

...
#include <avr/interrupt.h>

volatile uint8_t intrs;

ISR(TIMER0_OVF_vect) {
    if (++intrs >= 62) { // meant to execute every second
        PORTB ^= (1 << PB5);
        intrs = 0;
    }
}

int main() {
    intrs = 0;
    ... // old setup
    sei();
    while(1) { ... }
}

现在,没有一个 LED 闪烁。更奇怪的是,当我删除 sei() 时,它们都不眨眼。我发现让第一个 LED 再次闪烁的唯一方法是注释掉 ISR 声明或将其标记ISR_NAKED

那么,是什么?

PS:我使用 makefile 来编译和加载。当我运行它时,它看起来像这样:

$ make
avr-gcc -c -Os -DF_cpu=16000000UL -mmcu=atmega328p -Wall -Wextra main.c
avr-gcc -o prog.elf main.o 
avr-objcopy -O ihex -R .eeprom prog.elf prog.hex
avrdude -C/etc/avrdude.conf -v -V -carduino -patmega328p -P/dev/ttyACM0 -b115200 -D -Uflash:w:prog.hex
.. # avrdude logs

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)