Определение ISR вызывает цикл загрузки?

Я пытаюсь скомпилировать и загрузить код в Arduino Uno из командной строки, однако, похоже, у меня возникла странная проблема.

Когда я скомпилирую этот код:

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

ISR(TIMER0_OVF_vect) {
}

int main() {
  while (true);
}

С помощью этих команд:

$ avr-gcc -mmcu=atmega328p -DF_CPU=16000000 -std=c17 -O3 -Wall -Wextra -c boot_loop.c -o boot_loop.o
$ avr-gcc boot_loop.o boot_loop.elf
$ avr-objcopy -j .text -j .data -O ihex boot_loop.elf boot_loop.hex
$ avrdude -p atmega328p -c arduino -P /dev/ttyUSB0 -U flash:w:boot_loop.hex

Мой Arduino попадает в цикл загрузки, светодиод мигает примерно 3 раза каждую секунду (аналогично тому, как вы нажимаете кнопку сброса или включается устройство).

Я пробовал это без пустого ISR, а также с другими векторами прерываний (например, TIMER0_COMPA_vect), но безрезультатно. Полное удаление определения ISR останавливает цикл загрузки.

, 👍0

Обсуждение

просто добавь "нет", @sa_leinad


1 ответ


Лучший ответ:

2

Ваша проблема не в вашем коде. Дело в том, как вы связываете свой эльф-файл.

Вы не указали чип для ссылки.

$ avr-gcc -mmcu=atmega328p boot_loop.o -o boot_loop.elf
,

Это билет! Не могу поверить, что я это пропустил, спасибо!, @Jack Wilsdon

Знаете, почему я так легко это заметил? Потому что *я* однажды сделал то же самое :), @Majenko