在ARM Cortex-M上实现FreeRTOS性能计数器
說(shuō)明:本文翻譯自Erich Styger的文章《Implementing FreeRTOS Performance Counters on ARM Cortex-M》,文章的權(quán)屬屬于原作者。
當(dāng)使用像FreeRTOS這樣的RTOS時(shí),遲早要問(wèn)一個(gè)問(wèn)題:每個(gè)任務(wù)花費(fèi)多少時(shí)間?基于Eclipse的MCUXpresso IDE具有很好的視圖,準(zhǔn)確顯示了此類信息:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FreeRTOS運(yùn)行時(shí)信息
為了使FreeRTOS(或“任務(wù)列表”視圖)顯示非常有用的信息,開(kāi)發(fā)人員必須提供幫助,以便RTOS可以收集此信息。本文說(shuō)明如何在ARM Cortex-M上完成此操作。
1、概述
不久前,我從處理器專家的角度討論了FreeRTOS的性能和運(yùn)行時(shí)分析中的該主題。這次是關(guān)于使用“本機(jī)” FreeRTOS和使用NXP MCUXpresso SDK,但是相同的原理將適用于Cortex-M處理器和微控制器的所有其他環(huán)境。至于FreeRTOS端口,我正在使用https://github.com/ErichStyger/McuOnEclipseLibrary中的端口,因?yàn)樵摱丝谝呀?jīng)存在所有需要的鉤子。GitHub上提供了本文中使用的所有文件和源。
2、如何工作
操作系統(tǒng)使用計(jì)數(shù)器來(lái)衡量任務(wù)執(zhí)行時(shí)間。因此,在任務(wù)上下文切換時(shí)間,此計(jì)數(shù)器用于確定該任務(wù)使用的時(shí)間。重要的一點(diǎn)是,該時(shí)間不是絕對(duì)的(例如37毫秒),而是一些“滴答聲”(例如241個(gè)滴答聲)。RTOS知道總體上使用了多少“滴答聲”。RTOS知道系統(tǒng)中有多少個(gè)任務(wù),因此它可以顯示每個(gè)任務(wù)花費(fèi)了總時(shí)間的百分比。另一個(gè)要注意的是,時(shí)間*包括*在中斷中花費(fèi)的時(shí)間。
這是一種非常簡(jiǎn)單但功能強(qiáng)大的估算任務(wù)執(zhí)行時(shí)間的方法,通常就是您所需要的。它可以通過(guò)一種非常簡(jiǎn)單的方式來(lái)實(shí)現(xiàn):使用一個(gè)使計(jì)數(shù)器遞增的計(jì)時(shí)器和一個(gè)用于讀取計(jì)數(shù)器值的函數(shù)。
要打開(kāi)性能測(cè)量,我必須啟用兩個(gè)FreeRTOS配置設(shè)置:
#define configUSE_TRACE_FACILITY 1 /* 1: include additional structure members and functions to assist with execution visualization and tracing, 0: no runtime stats/trace */#define configGENERATE_RUN_TIME_STATS 1 /* 1: generate runtime statistics; 0: no runtime statistics */要配置計(jì)時(shí)器并讀取計(jì)數(shù)器,我必須使用兩個(gè)宏來(lái)告訴函數(shù)名稱:
#define configGET_RUNTIMER_COUNTER_VALUE_FROM_ISR?? AppGetRuntimeCounterValueFromISR#define configCONFIGURE_TIMER_FOR_RUNTIME_STATS???? AppConfigureTimerForRuntimeStats3、使用“滴答”計(jì)數(shù)器
一種非常簡(jiǎn)單的衡量任務(wù)執(zhí)行情況的方法是使用FreeRTOS滴答計(jì)數(shù)器本身??梢酝ㄟ^(guò)以下方式啟用
#define configGENERATE_RUN_TIME_STATS_USE_TICKS???? (1)但是,這僅在任務(wù)執(zhí)行時(shí)間超過(guò)RTOS滴答周期時(shí)才能測(cè)量任務(wù)執(zhí)行時(shí)間。對(duì)于更快的任務(wù),此方法沒(méi)有用。根據(jù)Nyquist-Shannon采樣定理,我最好使用2倍(更好:10倍)的測(cè)量頻率。
4、使用Cortex-M周期計(jì)數(shù)器
實(shí)現(xiàn)該計(jì)數(shù)器的另一種方法是使用Cortex-M周期計(jì)數(shù)器,該計(jì)數(shù)器已在許多設(shè)備上實(shí)現(xiàn),并給出了很好的結(jié)果。最好的是:無(wú)需中斷或額外的計(jì)時(shí)器。可能的實(shí)現(xiàn)如下所示:
static uint32_t prevCycleCounter, cycleCntCounter = 0;void AppConfigureTimerForRuntimeStats(void) {cycleCntCounter = 0;McuArmTools_InitCycleCounter();prevCycleCounter = McuArmTools_GetCycleCounter(); }uint32_t AppGetRuntimeCounterValueFromISR(void) {uint32_t newCntr, diff;newCntr = McuArmTools_GetCycleCounter();diff = newCntr-prevCycleCounter;prevCycleCounter = newCntr;cycleCntCounter += diff>>12; /* scale down the counter */return cycleCntCounter; }5、使用定期定時(shí)器中斷
標(biāo)準(zhǔn)方法是使用定期中斷計(jì)時(shí)器,該計(jì)時(shí)器增加計(jì)數(shù)器。對(duì)于1 kHz滴答計(jì)時(shí)器,推薦的頻率是FreeRTOS滴答計(jì)時(shí)器頻率的10倍,在這種情況下為10 kHz(100 us):
static uint32_t perfCounter = 0;#define PIT_BASEADDR?????? PIT #define PIT_SOURCE_CLOCK?? CLOCK_GetFreq(kCLOCK_BusClk) #define PIT_CHANNEL??????? kPIT_Chnl_0 #define PIT_HANDLER??????? PIT0_IRQHandler #define PIT_IRQ_ID???????? PIT0_IRQnvoid PIT_HANDLER(void) {PIT_ClearStatusFlags(PIT_BASEADDR, PIT_CHANNEL, kPIT_TimerFlag);perfCounter++;__DSB(); }void AppConfigureTimerForRuntimeStats(void) {pit_config_t config;PIT_GetDefaultConfig(&config);config.enableRunInDebug = false;PIT_Init(PIT_BASEADDR, &config);PIT_SetTimerPeriod(PIT_BASEADDR, PIT_CHANNEL, USEC_TO_COUNT(100U, PIT_SOURCE_CLOCK));PIT_EnableInterrupts(PIT_BASEADDR, PIT_CHANNEL, kPIT_TimerInterruptEnable);NVIC_SetPriority(PIT_IRQ_ID, 0);EnableIRQ(PIT_IRQ_ID);PIT_StartTimer(PIT_BASEADDR, PIT_CHANNEL); }uint32_t AppGetRuntimeCounterValueFromISR(void) {return perfCounter; }6、摘要
FreeRTOS包含一項(xiàng)功能,可以測(cè)量相對(duì)于系統(tǒng)中其他任務(wù)的任務(wù)執(zhí)行時(shí)間。我需要提供的是計(jì)時(shí)器或某種計(jì)數(shù)器的初始化例程,以及獲取計(jì)數(shù)器值的方法。如果您對(duì)檢查FreeRTOS計(jì)時(shí)的其他方式感興趣,請(qǐng)查看Percepio Tracealyzer或Segger?SystemView。如果您希望應(yīng)用程序本身顯示性能數(shù)據(jù),請(qǐng)查看“?使用FreeRTOS進(jìn)行性能和運(yùn)行時(shí)分析”中介紹的Shell / Commandline實(shí)現(xiàn)。
7、鏈接
- GitHub上的項(xiàng)目:https?:?//github.com/ErichStyger/mcuoneclipse/tree/master/Examples/MCUXpresso/tinyK22/tinyK22_FreeRTOS
- FreeRTOS的性能和運(yùn)行時(shí)分析
- 在Eclipse中更好的FreeRTOS調(diào)試
- ARM SWO性能計(jì)數(shù)器
- GitHub上的McuLib:https?:?//github.com/ErichStyger/McuOnEclipseLibrary
- MCUXpresso IDE和SDK:https?://mcuxpresso.nxp.com
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的在ARM Cortex-M上实现FreeRTOS性能计数器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 区块链读书笔记四
- 下一篇: 最优化学习笔记(三)最速下降法