Я спотыкался о обработчике hardfault freertos и его анализе, чтобы выяснить причину ошибки, загрузив регистры стека в оперативную память.
Это написано в ассамблее. Есть ли способ, которым я могу перевести это в код C и выполнить?
static void HardFault_Handler(void) { __asm volatile ( " tst lr, #4 \n" " ite eq \n" " mrseq r0, msp \n" " mrsne r0, psp \n" " ldr r1, [r0, #24] \n" " ldr r2, handler2_address_const \n" " bx r2 \n" " handler2_address_const: .word prvGetRegistersFromStack \n" ); }
От
Эта функция извлекает только указатель на стек, где хранится все содержимое регистров до исключения (т. Е. Для ARM Cortex M7 вы можете найти больше информации о фреймах исключений). Вот).
Затем он вызывает функцию prvGetRegistersFromStack
, который уже написан в C
где вы можете проверить все регистры из определенных переменных (r0
, r1
и так далее).
Один из этих регистров, pc
, хранит адрес инструкции, которая вызвала ошибку. Вы можете проверить карту памяти, чтобы узнать, какая функция вызвала ее.
После этой функции на странице, на которую вы ссылаетесь, есть раздел «Использование значений регистра», в котором объясняется, как установить точку останова по адресу инструкции.
Вам не нужно ничего переводить, FreeRTOS уже сделал это для вас.
Других решений пока нет …