FreeRTOS 调试方法
很多时候,我们需要了解任务的执行状态,任务栈的使用情况以及各个任务的 CPU 使用率,这时就需要用到官方提供的两个函数 vTaskList 和 vTaskGetRunTimeStats。用户就可以通过这两个函数获得任务的执行情况。
STM32F103 实现串口打印调试
为了获取 FreeRTOS 的任务信息,需要创建一个定时器,这个定时器的时间基准精度要高于系统时钟节拍,这样得到的任务信息才准确。这里提供的函数仅用于测试目的,切不可将其用于实际项目,原因有两点:
◆ FreeRTOS 的系统内核没有对总的计数时间做溢出保护。
◆ 定时器中断是 50us 进入一次,比较影响系统性能。 这里使用的是 32 位变量来保存 50us 一次的计数值,最大支持计数时间:2^32 * 50us / 3600s = 59.6 分钟。运行时间超过了 59.6 分钟将不准确。 具体在 FreeRTOS 的工程中如何做才可以实现任务信息获取呢?
下面分三步进行说明。
1 使能相关宏定义 需要在 FreeRTOSConfig.h 文件中使能如下宏定义:
其中变量 ulHighFrequencyTimerTicks 是需要用户去定义的,这里是将其定义在了定时器初始化文件 SysInfoTest.c 里面。
2 精度高于滴答定时器的时钟初始化
这里采用 STM32F103 内部的TIM6 实现 50us 一次的中断,在中断函数里面对变量 ulHighFrequencyTimerTicks 进行计数操作,以供 FreeRTOS 系统使用,具体的代码如下:
其中函数 bsp_SetTIMforInt 在文件 bsp_tim_pwm.c 里面进行了实现,源代码如下:
了解函数功能,不必细看
3 获取任务执行情况
通过前面的设置后,就可以在工程中通过FreeRTOS的两个函数vTaskList和 vTaskGetRunTimeStats 获取任务的执行情况。这里我们分成简单的两步进行说明:
◆ 第 1 步:先做精度高于滴答定时器的时钟初始化
◆ 第 2 步:初始化好以后就可以在 FreeRTOS 的任务中使用了。这里将任务信息获取功能放在了任务 vTaskTaskUserIF 里面去实现:

上面截图中打印出来的任务状态字母 B, R, D, S 对应如下含义:
#define tskBLOCKED_CHAR ( 'B' ) 任务阻塞
#define tskREADY_CHAR ( 'R' ) 任务就绪
#define tskDELETED_CHAR ( 'D' ) 任务删除
#define tskSUSPENDED_CHAR ( 'S' ) 任务挂起
另外要注意剩余栈的单位是 word,即 4 字节。比如 vTaskUserIF 任务的剩余栈是 321,代表 321*4 = 1284 字节