运行时统计信息

        FreeRTOS可以选择性收集关于每个任务所用处理时间量的信息,然后用vTaskGetRunTimeStats() 以表格形式显示此信息。如图每个任务会显示:该任务执行占用的总abs 时间 和 所占所有任务总处理时间的百分比。

        注意:vTaskGetRunTimeStats()执行期间会禁用中断,它不是作为正常的应用程序运行时的工具,而是作为调试辅助工具。

/* 以下宏配置为1时,才可调用 vTaskGetRunTimeStats */
/* 启用收集运行时统计信息 */
#define configGENERATE_RUN_TIME_STATS 1
/* 启动时会自动调用portCONFIGURE_TIMER_FOR_RUN_TIME_STATS 接口 */
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1


/* pcWriteBuffer: 执行时间将以ASCII形式写入的缓冲区,
    大约为每个任务分配40字节的缓冲区就足够了 */
/* 实现:调用uxTaskGetSystemState(),并将其值转换成易于读的ASCII值 */
void vTaskGetRunTimeStats( char *pcWriteBuffer );


/* 若要调用vTaskGetRunTimeStats, 应用程序需要完成以下接口的实现 */
/* 配置外设定时器: 该定时器通常比tick中断具有更高分辨率(10~100倍),否则统计信息可能不准确 */
portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
/* get定时器的当前计数值 */
portGET_RUN_TIME_COUNTER_VALUE()

RTOS追踪功能(跟踪钩子宏)

        跟踪钩子宏是一个非常强大的功能,允许收集有关嵌入式应用程序行为的数据(用作监控,调试,性能分析)。FreeRTOS 提供了很多hook点,可用于在内核发生关键事件时,执行自己的code。如下所示,其他trace相关宏定义可参见:trace相关宏定义

/* 任务切换:可自定义实现对应的宏,记录任务切换信息 */
traceTASK_SWITCHED_IN()
traceTASK_SWITCHED_OUT()

/* 如可类似如下定义,去记录Task 进入时间 & 退出时间, 以统计各任务运行时间*/
#define traceTASK_SWITCHED_IN() \
    task_start_time = get_time();

#define traceTASK_SWITCHED_OUT() \
    task_runtime[current_task] += get_time() - task_start_time;


/* 如可记录进入log,以用于调度问题分析 */
#define traceTASK_SWITCHED_IN() \
    log("Switch to %s", pcTaskGetName(NULL));



/* 队列操作 */
traceTASK_SWITCHED_IN()
traceTASK_SWITCHED_OUT()


/* 定时器 */
traceTIMER_CREATE()
traceTIMER_COMMAND_SEND()

/* 内存分配 */
traceTIMER_CREATE()
traceTIMER_COMMAND_SEND()

        也可以借助第三方跟踪工具,如:专用于FreeRTOS的第三方跟踪工具(FreeRTOS-Plus-Trace)

参考

运行时间统计

CPU使用率统计

Task实用接口

RTOS追踪功能

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐