Определение 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 останавливает цикл загрузки.
@Jack Wilsdon, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша проблема не в вашем коде. Дело в том, как вы связываете свой эльф-файл.
Вы не указали чип для ссылки.
$ avr-gcc -mmcu=atmega328p boot_loop.o -o boot_loop.elf
Это билет! Не могу поверить, что я это пропустил, спасибо!, @Jack Wilsdon
Знаете, почему я так легко это заметил? Потому что *я* однажды сделал то же самое :), @Majenko
- Как прервать функцию цикла и перезапустить ее?
- Arduino использует задержку в I2C ReceiveEvent
- Почему сопротивление между выводом ввода-вывода и землей падает, когда Arduino не питается
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Как правильно использовать volatile переменные в Arduino?
- Серийное прерывание
просто добавь "нет", @sa_leinad