[其他ST产品] 如何测量FreeRTOS 中每个任务的 CPU 使用率?

[复制链接]
 楼主| 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的运行时间,需要使用一个高精度的定时器
Zhiniaocun 发表于 2025-5-10 21:52 | 显示全部楼层
我们需要创建一个专门的任务来获取和计算各个任务的CPU使用率
Zuocidian 发表于 2025-5-10 22:29 | 显示全部楼层
可以使用[size=0.875]vTaskList[size=0.875]vTaskGetRunTimeStats函数来获取任务的运行状态和CPU使用情况。
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
    }
}


Xiashiqi 发表于 2025-5-11 07:11 | 显示全部楼层
由于使用的是32位变量来记录系统运行的时间计数值,按20000Hz的中断频率计算,最大支持计数时间为59.6分钟。超过这个时间后,统计结果将不准确
小海师 发表于 2025-5-11 07:43 | 显示全部楼层
持续响应定时器的中断可能会对系统性能产生一定影响,特别是在资源有限的嵌入式系统中
Haizangwang 发表于 2025-5-11 08:22 | 显示全部楼层
FreeRTOS内核没有对总的计数时间做溢出保护,如果需要长时间运行,可能需要考虑其他方法来避免溢出问题。
wowu 发表于 2025-5-11 08:58 | 显示全部楼层
它容易影响产品的性能,在正式产品中,建议关闭这一功能。
淡漠安然 发表于 2025-5-13 14:16 | 显示全部楼层
若定时器中断未正确配置或未触发,计时器计数值无法更新,导致统计结果为0
三生万物 发表于 2025-5-13 14:21 | 显示全部楼层
FreeRTOS中测量每个任务的CPU使用率时,若调用vTaskGetRunTimeStats()未返回有效数据,且uxTaskGetSystemState()显示任务使用0个时钟周期,需重点检查计时器配置和宏定义实现

江河千里 发表于 2025-5-13 15:49 | 显示全部楼层
若定时器中断未正确配置或未触发,计时器计数值无法更新,导致统计结果为0

光辉梦境 发表于 2025-5-13 16:10 | 显示全部楼层
在用户代码中定义并初始化一个高精度定时器(如TIM6),中断周期建议至少为100μs

暖了夏天蓝了海 发表于 2025-5-13 17:00 | 显示全部楼层
检查中断优先级,确保定时器中断优先级高于FreeRTOS内核中断,避免中断被屏蔽。

别乱了阵脚 发表于 2025-5-13 18:22 | 显示全部楼层
在定时器中断服务函数中设置断点,确认中断正常触发。调试时观察g_osRuntimeCounter是否随时间递增。

夜阑风雨 发表于 2025-5-13 19:54 | 显示全部楼层
通过串口输出统计信息,或使用STM32CubeIDE的调试器查看变量值。并且建议启用统计功能会轻微增加系统负载,建议在调试阶段使用,生产环境可关闭。


冰春彩落下 发表于 2025-5-13 20:00 | 显示全部楼层
运行任务后调用vTaskGetRunTimeStats(),检查输出结果是否包含任务名称、运行时间及CPU使用率

光辉梦境 发表于 2025-5-13 21:01 | 显示全部楼层
芯片出厂时存储的校准值(TS_CAL1TS_CAL2)是基于特定条件(如3V参考电压、14ADC)下测得,若实际使用条件(如3.3V参考电压、12ADC)与之不符,需对校准值进行转换

您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

69

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部