尝试使用 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 错误