打印
[其他ST产品]

如何测量FreeRTOS 中每个任务的 CPU 使用率?

[复制链接]
428|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lvluoo|  楼主 | 2025-4-28 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 STM32CubeIDE GUI 中启用了所有运行时和任务统计,
并进行了相关定义GENERATE_RUN_TIME_STATS、USE_TRACE_FACILITY 和 USE_STATS_FORMATTING_FUNCTIONS。
当我调用 vTaskGetRunTimeStats() 时,未返回任何内容。
vTaskGetRunTimeStats() 中的函数 uxTaskGetSystemState() 返回任务每次使用 0 个时钟周期。
是否需要设置计时器或重新定义某些功能才能正常工作?

使用特权

评论回复
沙发
heimaojingzhang| | 2025-5-10 20:11 | 只看该作者
要启用FreeRTOS的运行时间统计功能,需要在FreeRTOSConfig.h文件中定义以下宏:

#define configGENERATE_RUN_TIME_STATS 1 // 启用运行时间统计功能
#define configUSE_TRACE_FACILITY 1      // 启用可视化追踪调试功能
#define configUSE_STATS_FORMATTING_FUNCTIONS 1 // 启用格式化函数功能



使用特权

评论回复
板凳
guanjiaer| | 2025-5-10 20:46 | 只看该作者
extern volatile uint32_t CPU_RunTime;

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (CPU_RunTime = 0UL)
#define portGET_RUN_TIME_COUNTER_VALUE() CPU_RunTime

上边的两个宏来计算CPU运行时间

使用特权

评论回复
地板
八层楼| | 2025-5-10 21:19 | 只看该作者
为了统计CPU的运行时间,需要使用一个高精度的定时器

使用特权

评论回复
5
Zhiniaocun| | 2025-5-10 21:52 | 只看该作者
我们需要创建一个专门的任务来获取和计算各个任务的CPU使用率

使用特权

评论回复
6
Zuocidian| | 2025-5-10 22:29 | 只看该作者
可以使用[size=0.875]vTaskList[size=0.875]vTaskGetRunTimeStats函数来获取任务的运行状态和CPU使用情况。

使用特权

评论回复
7
Puchou| | 2025-5-10 23:11 | 只看该作者
void Cpu_task(void const *argument) {
    uint8_t CPU_RunInfo[512];
    while (1) {
        memset(CPU_RunInfo, 0, sizeof(CPU_RunInfo));
        vTaskList((char *)&CPU_RunInfo);
        printf("---------------------------------------------\r
");
        printf("任务名       任务状态     优先级     剩余栈     任务序号\r
");
        printf("%s", CPU_RunInfo);
        printf("---------------------------------------------\r
");

        memset(CPU_RunInfo, 0, sizeof(CPU_RunInfo));
        vTaskGetRunTimeStats((char *)&CPU_RunInfo);
        printf("任务名         运行计数     使用率\r
");
        printf("%s", CPU_RunInfo);
        printf("---------------------------------------------\r

");

        osDelay(200); // 延时500个tick
    }
}


使用特权

评论回复
8
Xiashiqi| | 2025-5-11 07:11 | 只看该作者
由于使用的是32位变量来记录系统运行的时间计数值,按20000Hz的中断频率计算,最大支持计数时间为59.6分钟。超过这个时间后,统计结果将不准确

使用特权

评论回复
9
小海师| | 2025-5-11 07:43 | 只看该作者
持续响应定时器的中断可能会对系统性能产生一定影响,特别是在资源有限的嵌入式系统中

使用特权

评论回复
10
Haizangwang| | 2025-5-11 08:22 | 只看该作者
FreeRTOS内核没有对总的计数时间做溢出保护,如果需要长时间运行,可能需要考虑其他方法来避免溢出问题。

使用特权

评论回复
11
wowu| | 2025-5-11 08:58 | 只看该作者
它容易影响产品的性能,在正式产品中,建议关闭这一功能。

使用特权

评论回复
12
淡漠安然| | 2025-5-13 14:16 | 只看该作者
若定时器中断未正确配置或未触发,计时器计数值无法更新,导致统计结果为0

使用特权

评论回复
13
三生万物| | 2025-5-13 14:21 | 只看该作者
FreeRTOS中测量每个任务的CPU使用率时,若调用vTaskGetRunTimeStats()未返回有效数据,且uxTaskGetSystemState()显示任务使用0个时钟周期,需重点检查计时器配置和宏定义实现

使用特权

评论回复
14
江河千里| | 2025-5-13 15:49 | 只看该作者
若定时器中断未正确配置或未触发,计时器计数值无法更新,导致统计结果为0

使用特权

评论回复
15
光辉梦境| | 2025-5-13 16:10 | 只看该作者
在用户代码中定义并初始化一个高精度定时器(如TIM6),中断周期建议至少为100μs

使用特权

评论回复
16
暖了夏天蓝了海| | 2025-5-13 17:00 | 只看该作者
检查中断优先级,确保定时器中断优先级高于FreeRTOS内核中断,避免中断被屏蔽。

使用特权

评论回复
17
别乱了阵脚| | 2025-5-13 18:22 | 只看该作者
在定时器中断服务函数中设置断点,确认中断正常触发。调试时观察g_osRuntimeCounter是否随时间递增。

使用特权

评论回复
18
夜阑风雨| | 2025-5-13 19:54 | 只看该作者
通过串口输出统计信息,或使用STM32CubeIDE的调试器查看变量值。并且建议启用统计功能会轻微增加系统负载,建议在调试阶段使用,生产环境可关闭。


使用特权

评论回复
19
冰春彩落下| | 2025-5-13 20:00 | 只看该作者
运行任务后调用vTaskGetRunTimeStats(),检查输出结果是否包含任务名称、运行时间及CPU使用率

使用特权

评论回复
20
光辉梦境| | 2025-5-13 21:01 | 只看该作者
芯片出厂时存储的校准值(TS_CAL1TS_CAL2)是基于特定条件(如3V参考电压、14ADC)下测得,若实际使用条件(如3.3V参考电压、12ADC)与之不符,需对校准值进行转换

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

18

帖子

0

粉丝