学习目标:
通过串口打印任务信息,包括:名称、运行时间、系统占用率、优先级、剩余栈区
使用工具:
C语言;STM32单片机;CubeMX、FreeRTOS、Keil、串口助手
实现过程及方法:
可通过Cubemx设置相应宏,实现weak函数
在 "FreeRTOSConfig.h" 中自定义宏,实现宏定义
vTaskGetRunTimeStats函数
函数原型:void vTaskGetRunTimeStats( char *pcWriteBuffer )
形参:传入数组,用来存储相关信息,没有边界检查,所以必须足够大,可容纳整个列表
作用:获取任务名称、任务运行时间、系统占用率
Notes:
运行时基:
任务运行计数时基(50us~100us) 设置比 系统时基(1ms) 快10、20倍。
两个宏置一:
configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS must both be set to 1 in FreeRTOSConfig.h
除此之外还需实现两个宏:
一:portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()初始化用来生成时基的外设;
二:portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 或 portALT_GET_RUN_TIME_COUNTER_VALUE() 用来返回当前基准时间值。
使用Cubemx置位宏定义,会提供两个weak函数:void configureTimerForRunTimeStats(void) 与 unsigned long getRunTimeCounterValue(void)
也可自行置起宏定义,实现两个宏,只不过用Cubemx置起宏生成后使用weak函数方便一些
效果: 任务名称 运行时间 系统占用率
所打印运行时间为周期数;如果想数据对齐或者转换时间为分钟,不建议使用本函数,因为需要将数据在单个数组中提取出来进行操作。建议使用vTaskGetInfo函数,可获得单个任务相关信息,存储在结构体中。
存在问题:
任务运行时间计算值与实测不符
printf打印中文存在乱码(有可能是编码格式问题)
vTaskList函数
函数原型:void vTaskList( char * pcWriteBuffer )
形参:指向事先准备好,用于存储任务信息的空间。必须足够大,没有边界检查。
作用:获取任务名称、状态、优先级、高水位(剩余最小栈区)、任务编号(用于区分被分配相同任务名的任务)
Notes:
vTaskList函数本质上使用 xTaskGetSystemState() API函数获取原始数据。
vTaskList在执行期间禁用中断。
configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must both be set to 1 within FreeRTOSConfig.h for vTaskList() to be available.
效果:
vTaskGetInfo函数
函数原型:void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState )
作用:获取单个任务信息;如要获取全部任务信息可使用 uxTaskGetSystemState() 函数代替。
形参:
xTask:任务句柄,可以使用函数 xTaskGetHandle 通过任务名称获取, INCLUDE_xTaskGetHandle must be set to 1 in FreeRTOSConfig.h for xTaskGetHandle() to be available. xTaskGetHandle 函数消耗时间较长,可将返回句柄存储起来,以便后续使用。
pxTaskStatus:指向事前定义好,用来存储任务信息的结构体
xGetFreeStackSpace:高水位标志,决定是否获取任务高水位(该任务曾经存在的堆栈空间的最小值),pdFALSE:不获取;pdTRUE:获取。
eState:任务状态,eInvalid:获取任务状态(需要一些时间);其他值:直接赋予给任务状态;
作用:获取任务名称、任务运行时间、系统占用率、优先级、剩余栈区……存储到事先准备好的结构体中,任务信息基本全都包含。
Notes:
仅限在调试中使用,该函数会导致任务调度器长时间处于挂起状态。
configUSE_TRACE_FACILITY must bet defined as 1 in FreeRTOSConfig.h
Notes:
该类函数会导致任务调度器较长时间处于挂起状态,占用资源多,应尽量减少该类函数的使用次数。
参考资料
【【参考资料】FreeRTOS_Reference_Manual_V9.0.0.pdf】