嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > MIMXRT1064的 FreeRTOS任务运行时统计信息

MIMXRT1064的 FreeRTOS任务运行时统计信息

    FreeRTOS有很多很酷的功能,其中一个是它可以报告每个任务中花费的CPU百分比。

    需要在FreeRTOSConfig.h中配置一些#定义:

#define configGENERATE_RUN_TIME_STATS           1

/* 1: generate runtime statistics; 0: no runtime statistics */

    可以使用Systick计时器,但这不会给精确的结果,因此我们该计时器。

#define configGENERATE_RUN_TIME_STATS_USE_TICKS 0

/* 1: Use the RTOS tick counter as runtime counter. 0: use extra timer */

    接下来,需要配置如何使用计时器:为此,指定计时器配置函数的名称和获取计时器值的函数:

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()   McuRTOS_AppConfigureTimerForRuntimeStats()

#define portGET_RUN_TIME_COUNTER_VALUE()           McuRTOS_AppGetRuntimeCounterValueFromISR()

    使用I.MX RT的GPT(通用计时器):    

#include "fsl_gpt.h"

uint32_t McuRTOS_RunTimeCounter; //需要一个用于测量时间的32位计数器

/* runtime counter, used for configGENERATE_RUNTIME_STATS */

将计时器配置为0.1毫秒(RTOS滴答计时器频率的10倍),设置为1 kHz:


static void AppConfigureTimerForRuntimeStats(void) {

  uint32_t gptFreq;

  gpt_config_t gptConfig;

 

  GPT_GetDefaultConfig(&gptConfig);

 

  /* Initialize GPT module */

  GPT_Init(GPT2, &gptConfig);

 

  /* Divide GPT clock source frequency by 3 inside GPT module */

  GPT_SetClockDivider(GPT2, 3);

 

  /* Get GPT clock frequency */

  gptFreq = CLOCK_GetFreq(kCLOCK_PerClk);

 

  /* GPT frequency is divided by 3 inside module */

  gptFreq /= 3;

 

  /* Set GPT module to 10x of the FreeRTOS tick counter */

  gptFreq = USEC_TO_COUNT(100, gptFreq); /* FreeRTOS tick is 1 kHz */

  GPT_SetOutputCompareValue(GPT2, kGPT_OutputCompare_Channel1, gptFreq);

 

  /* Enable GPT Output Compare1 interrupt */

  GPT_EnableInterrupts(GPT2, kGPT_OutputCompare1InterruptEnable);

 

  /* Enable at the Interrupt and start timer */

  EnableIRQ(GPT2_IRQn);

  GPT_StartTimer(GPT2);

}


接下来是计时器中断服务例程的实现。

void GPT2_IRQHandler(void) {

  /* Clear interrupt flag.*/

  GPT_ClearStatusFlags(GPT2, kGPT_OutputCompare1Flag);

  McuRTOS_RunTimeCounter++; /* increment runtime counter */

#if defined __CORTEX_M && (__CORTEX_M == 4U || __CORTEX_M == 7U)

  __DSB();

#endif

}

最后,在启动调度器之前,必须调用Timer初始化函数。

使用串行连接接口(UART、USB、SEGGER RTT),也可以使用命令行接口检索相同的信息:



信息显示在Eclipse环境下的FreeRTOS任务列表的“运行时”列中(针对MCUXpresso IDE显示):

    在FreeRTOS中收集运行时信息通常需要计时器(也可以使用SysTick)。收集的信息可以很好地概括CPU时间的使用情况,从而有助检查系统负荷。

参考文档:

mcuoneclipse/Examples/MCUXpresso/i.MX RT1064_EVK/MIMXRT1064_FreeRTOS at master · ErichStyger/mcuoneclipse · GitHub


FreeRTOS Task Runtime Statistics for NXP i.MX RT1064 | MCU on Eclipse