freertos打印任务堆栈
时间: 2025-04-18 15:15:13 浏览: 27
### 如何在 FreeRTOS 中打印任务堆栈信息
为了获取并显示 FreeRTOS 的任务堆栈信息,可以利用 `uxTaskGetStackHighWaterMark` 函数来查询每个任务自创建以来最低空闲栈空间的最大值。这有助于评估任务所需的实际栈大小,并优化分配给该任务的栈空间。
```c
void PrintTaskStackInfo(void)
{
TaskStatus_t *pxTaskStatusArray;
UBaseType_t uxArraySize, x;
/* 获取当前系统中的活动任务数量 */
uxArraySize = uxTaskGetNumberOfTasks();
/* 分配内存用于存储所有任务的状态 */
pxTaskStatusArray = pvPortMalloc( sizeof( TaskStatus_t ) * uxArraySize );
if( pxTaskStatusArray != NULL )
{
/* 将所有任务的状态写入数组 */
uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL );
for( x = 0; x < uxArraySize; x++ )
{
char cTaskName[ configMAX_TASK_NAME_LEN ];
strncpy(cTaskName, (char*)pcTaskGetName(pxTaskStatusArray[x].xHandle), configMAX_TASK_NAME_LEN);
cTaskName[configMAX_TASK_NAME_LEN - 1] = '\0';
printf("Task Name: %s\n", cTaskName); // 输出任务名称
/* 打印剩余最高水位线(即最小可用栈深度),单位为字 */
printf("Highest Water Mark: %u words remaining\n",
pxTaskStatusArray[x].usStackHighWaterMark);
/* 计算已使用的栈百分比 */
uint8_t ucCurrentPriority;
size_t stackDepthWords = pxTaskStatusArray[x].usStackHighWaterMark;
size_t usedStackSizeBytes = ((stackDepthWords + 1) * portGET_STACK_TYPE_SIZE()) -
pxTaskStatusArray[x].usStackHighWaterMark * portGET_STACK_TYPE_SIZE();
float usagePercentage = (float)(usedStackSizeBytes / (portGET_STACK_TYPE_SIZE() * pxTaskStatusArray[x].usStackDepth)) * 100.0f;
printf("Used Stack Size Percentage: %.2f%%\n", usagePercentage);
}
vPortFree(pxTaskStatusArray);
}
}
```
上述代码片段展示了如何遍历所有正在运行的任务,并收集有关它们栈使用情况的数据[^2]。通过调用 `uxTaskGetSystemState()` 可以获得一系列关于各个任务的具体细节,其中包括高水位标记——这是指自从任务启动之后从未被占用过的最大连续栈区域长度;换句话说也就是最接近满载时仍保持未使用的那一部分栈区间的尺寸。此函数返回的结果可以帮助开发者了解程序执行期间各任务实际消耗了多少栈空间,从而做出合理的调整以防止潜在的溢出风险。
阅读全文
相关推荐


















