日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

在ARM Cortex-M上实现FreeRTOS性能计数器

發(fā)布時(shí)間:2024/7/23 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在ARM Cortex-M上实现FreeRTOS性能计数器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說(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í)間?基于EclipseMCUXpresso 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???? AppConfigureTimerForRuntimeStats

3、使用滴答計(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 kHz100 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 TracealyzerSegger?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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。