multithreading - 尝试使用 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;
}
当我注释掉任何一项任务时,我都能让它工作。我猜这与记忆有关,但我还没有找到解决方案。
解决方案
vTaskList 依赖于 sprintf。所以,你对内存和堆的猜测是正确的。但是您必须使用 malloc 并传递该块而不是您所做的。使用 pvPortmalloc,完成后,使用 vportfree 释放它。另外,值得注意的是 vTaskList 是一个阻塞函数。我现在没有工作代码示例来显示这一点,但这应该可以工作。由于未初始化的指针,经常(几乎一直)发生硬故障。上述方法将消除这一点。
推荐阅读
- php - 在 PHP 中计算朋友的数量
- python - Python Groupby 转换多个参数
- camera-calibration - 计算透视投影中两个矩形之间的角度
- java - Hibernate @email 不关心域或 FQDN
- java - 在 java 中读取、加载和卸载非常大的二进制文件的内存部分的有效方法。
- reactjs - react-intl FormattedMessage 注册 reduxForm 后未更新
- reactjs - 如何解决或忽略 Redux 连接组件中的 React Strict Mode 警告?
- java - Java - why would one use the state design pattern over saving the state in a variable?
- javascript - Codepen.io 中的 ReactJS 和 Bootstrap 遇到问题
- spring - 如何在不显示在 URL 中的情况下跟踪某些用户数据