Диагностика Imprecise Bus Faults в микроконтроллерах Cortex-M3/M4/M4F
При разработке программ для систем на микроконтроллерах серий Cortex-M3/M4/M4F программисты, бывает, сталкиваются с исключениями ядра, когда программа останавливается в бесконечном цикле в обработчике FaultISR. Как правило, попадая в этот обработчик вы уже не можете определить что произошло, т.к. стек вызовов в отладчике уже не отображается. Еще хуже, если в регистре Fault Status появится ошибка Imprecise Bus Error. Вот про диагностику этой ошибки я и расскажу.
Разрабатывая проект на микроконтроллере TI Tiva под управлением FreeRTOS я столкнулся с подобной ситуацией, когда, в результате тестирования, программа стала попадать в исключение. Падение было плавающим, т.е. момент возникновения неисправности проявлялся через случайное время после старта программы.
Фирма Texas Instruments выпустила документ Diagnosing Software Faults in Stellaris ® Microcontrollers в котором содержится мого интересной информации для диагностики программных проблем. Но про Imprecise Bus Error вообще мало информации. Написано лишь, что это асинхронная ошибка и в регистре адреса не содержится точного адреса инструкции вызвавшей ошибку. В моем случае все шаги по поиску неисправности описанные у TI для Imprecise Bus Fault привели лишь в функцию vPortStartFirstTask(), эта функция запускает задачи во FreeRTOS. Тупик? Не совсем.
Плотный поиск в интернете навел меня на форум Freescale и документ A Way to Detect Imprecise Hard Fault Source. Там я и нашел более полное описание ошибки Imprescise Bus Fault и интересный способ ее диагностики. Итак, по порядку. Микроконтроллеры Cortex имеют WriteBuffer для инструкций и выполнение следующей инструкции начинается до завершения предыдущей. Это увеличивает производительность, но усложняет отладку. В случае Imprescise Bus Fault ошибку вызвыает предыдущая инструкция, когда регистр PC уже указывает на следующую в очереди команду.
К счастью, разработчики ядра Cortex, предусмотрели возможность отключения этого буфера. У микроконтроллера Kinetix фирмы Freescale это производится в регистре Auxiliary Control путем установки бита DISDEFWBUF. В моем случае у микроконтроллера Tiva TM4C1294NCPDT фирмы Texas Instruments тоже есть регистр Auxiliary Control, только бит называется DISWBUF. Думаю, что и у микроконтроллеров других производителей есть что то подобное.
Я прописал установку этого бита в начале функции main моей программы, чтобы не ставить его каждый раз из отладчика.
После запуска программы я опять получил ошибку, но на этот раз это была Precise Bus Fault, что мне и было нужно. На скриншоте видно что регистр NVIC_FAULT_STAT имеет значение 0x0008200 - это и есть Precise Bus Fault. При этом в регистре NVIC_FAULT_ADDR содержится адрес инструкции вызвавшей ошибку 0х00005369. Можно посмотреть дизассемблером по этому адресу.
Это была функция xQueueGenericSend(), которая отдавала Mutex прсле использования общего ресурса. В моем случае оказалось что портился объект Mutex, а проблема была в не проинициализированном локальном указателе.
Я надеюсь что эта техника перевода Imprecise Bus Fault в Precise Bus Fault поможет кому-нибудь еще.
- блог пользователя GDI
- 18256 просмотров
Новые записи в блогах
- Устранение дребезга контактов на основе вертикальных счетчиков
- Диагностика 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 на русский микропроцессор КРОЛИК
Recent comments
9 часов 10 минут назад
2 дня 23 часа назад
3 дня 2 часа назад
3 дня 2 часа назад
3 дня 9 часов назад
3 дня 16 часов назад
4 дня 3 часа назад
4 дня 7 часов назад
5 дней 8 часов назад
5 дней 21 час назад