Получение Hard Fault при попытке перечислить все задачи с помощью vTaskList () - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь перечислить состояние всех задач, которые в данный момент выполняются, используя vTaskList (). Всякий раз, когда я вызываю функцию, я получаю HardFault, и я понятия не имею, где он выходит из строя. Я попытался увеличить размер кучи и размер стека. Это приводит к тому, что vTaskList () работает один раз, но во второй раз снова выдает серьезную ошибку. Ниже описано, как я использую vTaskList () в osThreadList ()

osStatus osThreadList (uint8_t *buffer)
{
#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) )
vTaskList((char *)buffer);
#endif
return osOK;
}

Ниже описано, как я использую osThreadList () для печати всех задач на моем последовательном терминале.

uint8_t TskBuf[1024];
bool IOParser::TSK(bool print_help)
{
if(print_help)
{
uart_printf("\nTSK: Display list of tasks.\r\n");
}
else
{
uart_printf("\r\nName          State  Priority  Stack   Num\r\n" );
uart_printf("---------------------------------------------\r\n");

/* The list of tasks and their status */
osThreadList(TskBuf);
uart_printf( (char *)TskBuf);
uart_printf("---------------------------------------------\r\n");
uart_printf("B : Blocked, R : Ready, D : Deleted, S : Suspended");
}
return true;
}

Когда Я комментирую любую из задач, которую я могу заставить работать. Я предполагаю, что это связано с памятью, но я не смог найти решение.

1 Ответ

1 голос
/ 02 апреля 2020

vTaskList зависит от sprintf. Итак, ваше предположение о памяти и куче верно. Но вы должны использовать mallo c и передать этот блок вместо того, что вы делаете. Используйте pvPortmallo c и после завершения sh освободите его с помощью vportfree. Также стоит отметить, что vTaskList является блокирующей функцией. У меня нет рабочего кода, чтобы показать это как сейчас, но это должно работать. Сильные неисправности часто (почти все время) случаются из-за неинициализированного указателя. Выше подход устранит это.

...