В 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)
{ #define REG_RA 1
... #define REG_MSTATUS 29
TaskStatus_t xTaskDetails;
vTaskGetInfo( NULL, &xTaskDetails, pdFALSE, eInvalid );
blog_info("Current task '%s' sp data:\r\n", xTaskDetails.pcTaskName);
blog_info("RA:%08x, mstatus:%08x\r\n",
regs[REG_RA], regs[REG_MSTATUS]);
...
Здесь для получения имени текущей задачи используется функция 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. 2. bouffalolab / bouffalo_sdk. 3. Bouffalo SDK. 4. vTaskGetInfo() site:freertos.org. 5. ESP-IDF FreeRTOS Task API. |