Сохранить обратный адрес ISR watchdog в EEPROM

Если WDT когда-либо сработает, из ISR я сохраню некоторую информацию в EEPROM для последующей диагностики, прежде чем вводить контакт сброса. Размер стека, размер кучи и т.д.

Также может быть полезно знать, где находился код, когда сработал WDT, т. е. обратный адрес ISR. Как мне это получить?

, 👍0

Обсуждение

Какая архитектура?, @Majenko

AVR… Arduino Pro Mini atmega328p, @Eric Nelson


1 ответ


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

5

В GCC есть удобная функция __встроенный_возврат_адрес(глубина), которая должна делать то, что вы хотите. Чтобы получить обратный адрес текущей функции (который должен быть одинаковым, независимо от того, является ли это обычной функцией или ISR на AVR), вы устанавливаете глубину на 0:

void *addr = __builtin_return_address(0);

ПРАВИТЬ

Адрес, возвращенный выше, является адресом word. Умножьте на два, чтобы получить байтовый адрес, как показано в разборке из прошивки avr-objdump-SC.elf >disassembled.txt>

Последняя найдена в ~/.platformio/пакеты/цепочка инструментов-atmelavr/bin/avr-objdump

,

Что ж, *это* было легко... спасибо! Следующее упражнение-выяснить, где это находится в коде., @Eric Nelson

Я не очень хорошо сформулировал это… следующее упражнение-выяснить, где находится этот обратный адрес в коде (или в пространстве), чтобы понять, что пошло не так., @Eric Nelson

@EricNelson: Разберите файл .elf с помощью avr-objdump-SC., @Edgar Bonet

@EdgarBonet ДА!! О, чувак, неужели это когда-нибудь возвращает меня в 90-е годы? Корпим над разобранным кодом, подсчитываем циклы, перестраиваем код, чтобы посмотреть, сможем ли мы выполнить еще несколько операций в секунду, чтобы выиграть тест., @Eric Nelson

"addr2line" тоже может оказаться удобным инструментом., @the busybee