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
- 7139 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика 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 на русский микропроцессор КРОЛИК


Комментарии
К слову
Отправить комментарий