FreeRTOS: как узнать имя задачи, в которой произошел сбой? |
![]() |
Добавил(а) microsin |
В Bouffalo SDK [1] есть функция registerdump (см. bl_irq.h и bl_irq.c), которая выводит в лог дамп при возникновении неисправимой ошибки, примерно такой: ... ===end sm_get_bss_params=== [WF][SM] Entering connecting state [ 548][INFO: wifi.c: 79] [APP] [EVT] Connecting 548 [ 2369][INFO: bl_irq.c: 354] Current task sp data: [ 2369][INFO: bl_irq.c: 356] RA:230048ce, mstatus:80007880 [ 2369][INFO: bl_irq.c: 359] A0:00000002 A1:00000000 A2:00000000 A3:00000000 A4:42023a28 A5:a5a5a5a5 A6:a5a55 [ 2369][INFO: bl_irq.c: 363] T0:a5a5a5a5 T1:a5a5a5a5 T2:a5a5a5a5 T3:a5a5a5a5 T4:a5a5a5a5 T5:a5a5a5a5 T6:a5a55 [ 2369][INFO: bl_irq.c: 366] S0:00000000 S1:4201c000 S2:00000000 S3:a5a5a5a5 S4:00000000 S5:a5a5a5a5 S6:a5a55 [ 2369][INFO: bl_irq.c: 370] S8:a5a5a5a5 S9:a5a5a5a5 S10:a5a5a5a5 S11:a5a5a5a5 Exception Entry--->>> [ 2369][INFO: bl_irq.c: 390] mcause 3800000b, mepc 23003f00, mtval 00000000 [ 2369][INFO: bl_irq.c: 202] Exception code: 11 msg:� Этот дамп можно доработать таким образом, чтобы выводилось имя задачи, где произошел сбой, для этого откройте bl_irq.c (для чипа BL602 он находится в каталоге bl_iot_sdk/components/platform/hosal/bl602_hal/) и внесите в него следующее исправление: static void registerdump(unsigned int *regs) { Здесь для получения имени текущей задачи используется функция vTaskGetInfo (см. [4, 5]). Теперь дамп будет более информативный, в нем появится имя задачи, и будет проще найти ошибку: [ 2369][INFO: bl_irq.c: 354] Current task 'My poor task' sp data: [ 2369][INFO: bl_irq.c: 356] RA:230048ce, mstatus:80007880 [ 2369][INFO: bl_irq.c: 359] A0:00000002 A1:00000000 A2:00000000 A3:00000000 A4:42023a28 A5:a5a5a5a5 A6:a5a55 [ 2369][INFO: bl_irq.c: 363] T0:a5a5a5a5 T1:a5a5a5a5 T2:a5a5a5a5 T3:a5a5a5a5 T4:a5a5a5a5 T5:a5a5a5a5 T6:a5a55 [ 2369][INFO: bl_irq.c: 366] S0:00000000 S1:4201c000 S2:00000000 S3:a5a5a5a5 S4:00000000 S5:a5a5a5a5 S6:a5a55 [ 2369][INFO: bl_irq.c: 370] S8:a5a5a5a5 S9:a5a5a5a5 S10:a5a5a5a5 S11:a5a5a5a5 Exception Entry--->>> [ 2369][INFO: bl_irq.c: 390] mcause 3800000b, mepc 23003f00, mtval 00000000 [ 2369][INFO: bl_irq.c: 202] Exception code: 11 msg:� vApplicationStackOverflowHook. Аналогичным образом можно доработать функцию vApplicationStackOverflowHook (см. модуль bfl_main.c, который для чипа BL602 находится в каталоге bl_iot_sdk/components/platform/soc/bl602/bl602/). Эта функция вызывается при переполнении стека задачи. Здесь уже не надо вызывать vTaskGetInfo, потому что имя задачи передается прямо в параметре pcTaskName. Исправление функции vApplicationStackOverflowHook в bfl_main.c: void vApplicationStackOverflowHook (TaskHandle_t xTask, char *pcTaskName) { //puts("Stack Overflow checked\r\n"); printf("Stack Overflow %s\r\n", pcTaskName); while (1) { /*empty here*/ } } [Ссылки] 1. bouffalolab / bl_iot_sdk. |