FreeRTOS有很多很酷的功能,其中一個(gè)是它可以報(bào)告每個(gè)任務(wù)中花費(fèi)的CPU百分比。
需要在FreeRTOSConfig.h中配置一些#定義:
#define configGENERATE_RUN_TIME_STATS 1
/* 1: generate runtime statistics; 0: no runtime statistics */
可以使用Systick計(jì)時(shí)器,但這不會(huì)給精確的結(jié)果,因此我們?cè)撚?jì)時(shí)器。
#define configGENERATE_RUN_TIME_STATS_USE_TICKS 0
/* 1: Use the RTOS tick counter as runtime counter. 0: use extra timer */
接下來,需要配置如何使用計(jì)時(shí)器:為此,指定計(jì)時(shí)器配置函數(shù)的名稱和獲取計(jì)時(shí)器值的函數(shù):
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() McuRTOS_AppConfigureTimerForRuntimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE() McuRTOS_AppGetRuntimeCounterValueFromISR()
使用I.MX RT的GPT(通用計(jì)時(shí)器):
#include "fsl_gpt.h" uint32_t McuRTOS_RunTimeCounter; //需要一個(gè)用于測量時(shí)間的32位計(jì)數(shù)器 /* runtime counter, used for configGENERATE_RUNTIME_STATS */ 將計(jì)時(shí)器配置為0.1毫秒(RTOS滴答計(jì)時(shí)器頻率的10倍),設(shè)置為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); } 接下來是計(jì)時(shí)器中斷服務(wù)例程的實(shí)現(xiàn)。 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 } 最后,在啟動(dòng)調(diào)度器之前,必須調(diào)用Timer初始化函數(shù)。 使用串行連接接口(UART、USB、SEGGER RTT),也可以使用命令行接口檢索相同的信息: |
信息顯示在Eclipse環(huán)境下的FreeRTOS任務(wù)列表的“運(yùn)行時(shí)”列中(針對(duì)MCUXpresso IDE顯示):
在FreeRTOS中收集運(yùn)行時(shí)信息通常需要計(jì)時(shí)器(也可以使用SysTick)。收集的信息可以很好地概括CPU時(shí)間的使用情況,從而有助檢查系統(tǒng)負(fù)荷。
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211578 -
計(jì)時(shí)器
+關(guān)注
關(guān)注
1文章
420瀏覽量
32689 -
FreeRTOS
+關(guān)注
關(guān)注
12文章
484瀏覽量
62139
原文標(biāo)題:MIMXRT1064的 FreeRTOS任務(wù)運(yùn)行時(shí)統(tǒng)計(jì)信息
文章出處:【微信號(hào):嵌入式 MCU,微信公眾號(hào):嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論