Serial_Printf
无法正确打印 FreeRTOS 的 vTaskList
输出,核心原因在于 vTaskList
的输出格式要求 与 Serial_Printf
的实现方式 不匹配,具体分析如下:
1. vTaskList
的工作原理
vTaskList
是 FreeRTOS 用于打印任务列表的函数,其原型为:
void vTaskList( char *pcWriteBuffer );
-
它需要一个 足够大的字符数组(缓冲区) 作为参数,将任务信息(任务名、状态、优先级、栈剩余空间、任务编号)格式化后写入该缓冲区。
-
输出格式是固定的表格形式(例如): plaintext
Task Name State Prio Stack Num Idle R 0 156 1 Task1 B 2 200 2
2. Serial_Printf
无法直接打印的原因
Serial_Printf
的实现是:
void Serial_Printf(char *format, ...)
{
char String[100]; // 固定大小的缓冲区(100字节)
va_list arg;
va_start(arg, format);
vsprintf(String, format, arg); // 将格式化内容写入 String 数组
va_end(arg);
Serial_SendString(String); // 发送缓冲区内容
}
缓冲区大小不足
vTaskList
输出的任务列表长度与任务数量相关:
- 每个任务至少占用约 30~50 字节(任务名 + 状态 + 优先级等信息)。
- 若系统有 3~4 个任务,总长度就会超过
Serial_Printf
内部的String[100]
缓冲区,导致 缓冲区溢出,内容被截断或错乱。