【FreeRTOS】函数vTaskGetRunTimeStats(char *pcWriteBuffer) 获取任务的运行时间

前置定义

在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);
     }
 }

执行效果

代码运行效果
FreeRTOS官方API文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值