首页 > 解决方案 > 尝试使用 vTaskList() 列出所有任务时出现硬故障

问题描述

我正在尝试使用 vTaskList() 列出当前正在运行的所有任务的状态。每当我调用该函数时,我都会得到一个 HardFault 并且我不知道它的故障所在。我尝试增加堆大小和堆栈大小。这会导致 vTaskList() 工作一次,但第二次会再次引发硬故障。以下是我在 osThreadList() 中使用 vTaskList() 的方式

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;
}

当我注释掉任何一项任务时,我都能让它工作。我猜这与记忆有关,但我还没有找到解决方案。

标签: multithreadingmallocstm32freertosiar

解决方案


vTaskList 依赖于 sprintf。所以,你对内存和堆的猜测是正确的。但是您必须使用 malloc 并传递该块而不是您所做的。使用 pvPortmalloc,完成后,使用 vportfree 释放它。另外,值得注意的是 vTaskList 是一个阻塞函数。我现在没有工作代码示例来显示这一点,但这应该可以工作。由于未初始化的指针,经常(几乎一直)发生硬故障。上述方法将消除这一点。


推荐阅读