欢迎光临散文网 会员登陆 & 注册

FreeRTOS 调试方法

2023-07-06 08:59 作者:自闭选手的Z23  | 我要投稿

    很多时候,我们需要了解任务的执行状态,任务栈的使用情况以及各个任务的 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 字节

FreeRTOS 调试方法的评论 (共 条)

分享到微博请遵守国家法律