AVR NULLPTR
Довольно часто при модульном программировании применяется вызов функции по указателю (для CallBack и т.п.)
Типичный синтаксис (кто не в курсе):
typedef void(*func_ptr)( void ); //////////////////////////////////////////////////////////////////////////////// void target_func( void ) { __no_operation(); } //////////////////////////////////////////////////////////////////////////////// int main( void ) { static func_ptr fp = target_func; fp(); fp = NULL; // искусственно допускаем ошибку fp(); // эх, забыли для отладки влепить ASSERT( fp ); Теперь предстоит найти источник ошибки }
первый вызов будет корректен, но второй вызове переход на 0x000000 который почти эквивалентен сбросу. Как найти, из какого файла и какого места был произведен переход ?
Для ARM-архитектуры это не проблема: там есть исключение DataAbort
Но AVR победнее будет, но как решить проблему нахождения источника ошибки сейчас покажу.
Для начала коннектимся через AvrStudio-JTAG/DebugWire к контроллеру и ставим BreakPoint на 0x000000.
Запускаем выполнение программы и ждем попадания на выставленный breakPoint
Далее, берется значение Stack Pointer, и ищутся байты, следующие за этим адресом ( Не включая байт по этому адресу !) .
Для мег с флеш > 128кБ берется три байта, для мег с флеш <= 128кБ берется два байта
и данное значение как есть вбивается в Program Counter (хоть AVR и Little Endian но стек растет с хвоста, и получается как Big Endian )
и попадаете на строку, куда должны были вернутся после выполнения функции
А там уже и номер строки, и имя файла как на ладони (если правда вы сделали экспорт из стороннего компилятора в UBROF-8 )
использованные материалы:
8-bit AVR Instruction Set
- блог пользователя megajohn
- 6937 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
- Self-powered камера
- Фоновый модулятор: беспроводная связь из ничего (перевод)
- Texas Instruments Analog Applications Journal SLYT612 "Снижение искажений в аналоговых КМОП ключах" (перевод)
- USB MSD. Часть 6. Команды SCSI (перевод)
- USB MSD. Часть 3. USB класс накопителей данных (перевод)
- Texas Instruments Application Report SBAA042 "Кодовые схемы, используемые в аналогово-цифровых преобразователях" (перевод)
- 10 принципов правильного интерфейса
- Релиз SDK на русский микропроцессор КРОЛИК
Комментарии
К слову
Отправить комментарий