前置定义
在FreeRTOSConfig.h中定义
#define configGENERATE_RUN_TIME_STATS 1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
#define configSUPPORT_DYNAMIC_ALLOCATION 1
extern uint32_t TimeCount;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (TimeCount = 0)
#define portGET_RUN_TIME_COUNTER_VALUE() TimeCount
函数调用
需要配置一个定时器,用于时间计数,计数器的频率应该至少是 滴答计数的 10 倍!
这里以TIM1,原滴答周期为1ms,j计数器时间不得低于100us,TIM时钟频率为72MHz,72-1分频,计数周期为100-1,定时为100us,开启TIM1 update interrupt中断,以下为函数重写
//在main.c中重写,因为把TIM7使用为系统滴答时钟源直接设置,在后面直接补充TIM1定时设置
uint32_t TimeCount = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM7) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
else if(htim->Instance == TIM1) {
TimeCount++;
}
/* USER CODE END Callback 1 */
}
//在App_Task.c/App_Task_Task2Func(void *args)中补充,以Task2为例
// 任务2执行函数
void App_Task_Task2Func(void *args)
{
char tmp[160]={0}; /*非常重要,大小为任务数乘40。
手册原文为:pcWriteBuffer执行时间将以 ASCII 形式写入的缓冲区。假设此缓冲区 的大小足以容纳生成的报告。大约为每个任务分配 40 字节的缓冲区就足够了
PS:需要提前分配大小,char *tmp无法正常运行*/
COM_DEBUG_PRINTF_LN("task2开始调度...");
while (1)
{
vTaskGetRunTimeStats(tmp);
COM_DEBUG_PRINTF_LN("%s\n", tmp);
vTaskDelay(500);
}
}