Как повесить ARM AT91SAM7X256 |
Добавил(а) microsin |
Тут решил собирать разные методы завешивания процессора и/или его переход по прерываниям Abort, Data Abort, Prefetch Abort, Undefined Instruction и методы их устранения (если разобрался, как). Самый частый способ завешивания программы - ошибки с указателями (неинициализированные, неправильно установленные указатели), или неправильная их интерпретация (например, имеется указатель на указатель, который был раньше обычным указателем, и не везде в программе исправлен код использования этого указателя). Другой самый частый глюк - выход за пределы массива. Такие тупые ошибки я тут не рассматриваю, поскольку они тривиальны и легко выявляются (если, конечно, программа не слишком запутанная). Очень неприятные ошибки - те, которые трудно исправить (особенно если код чужой). Например, функция библиотеки ведет себя не так, как ожидалось, либо скомпилированный код ведет себя не так, как хотелось бы. Обычно это происходит не потому, что ошибка в библиотеке или компиляторе, а просто недостаточно знаний, как их правильно использовать (хотя бывают и исключения из этого правила). Тогда помогает поиск документации и/или тщательная её разборка. Иногда приходится экспериментировать с разными вариантами кода одного и того же алгоритма. [Способ 1] Тут реализована казалось бы невинная идея скопировать в буфер dspdata по нужному адресу 16-битное слово (младшая половина от 32-битного bytecnt): bytecnt = 135; Последняя команда, на которой ARM виснет, компилируется в следующий код: На последней команде (STRH) микроконтроллер вешается (управление попадает на Abort_Handler:), причем непонятно, почему. Решить проблему удалось в обход, используя функцию memcpy. [Способ 2] if (crc == *(u16*)(dst->data)) Эта конструкция может вызвать Data Abort, если адрес dst->data нечетный, например равен 0x0020D3B1. Вот в такой ассемблерный код компилируется этот оператор if, исключение Data Abort срабатывает при выполнении 3-ей строки (адрес 0x00126370): Обойти ситуацию удалось, делая побайтовую выборку u16: Другой пример похожей ошибки (произойдет зависание, если адрес pnt нечетный): u8* pnt; [Ссылки] 1. IAR EW ARM: программа вылетает в Abort_Handler. |