尝试使用 vTaskList() 列出所有任务时出现硬故障

Posted

技术标签:

【中文标题】尝试使用 vTaskList() 列出所有任务时出现硬故障【英文标题】:Getting a Hard Fault when trying to list all tasks using vTaskList() 【发布时间】:2020-07-13 13:01:37 【问题描述】:

我正在尝试使用 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;

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的。任务名称字符串的初始化器呢?只是一个想法......

以上是关于尝试使用 vTaskList() 列出所有任务时出现硬故障的主要内容,如果未能解决你的问题,请参考以下文章

运行简单 Airflow BashOperator 时出现 TemplateNotFound 错误

使用 OleDB 列出所有存储过程和查询时出现不明确的外部连接错误

列出任务栏中所有打开的工作簿

尝试将新对象添加到列表时出现 404 错误 MVC

使用 Ktor 发送发布请求时出现内部服务器错误

尝试使用 AWS CLI 运行 ECS 任务时出现资源:内存错误