Программирование ARM FreeRTOS: как узнать имя задачи, в которой произошел сбой? Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


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)
{
#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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page