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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用FreeRTOS进行性能和运行时分析

發(fā)布時間:2024/7/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用FreeRTOS进行性能和运行时分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在MCU on Eclipse網(wǎng)站上看到Erich Styger在2月25日發(fā)的博文,一篇關(guān)于使用FreeRTOS進行性能和運行分析的文章,本人覺得很有啟發(fā),特將其翻譯過來以備參考。當然限于個人水平,有描述不當之處懇請指正。原文網(wǎng)址:https://mcuoneclipse.com/2018/02/25/performance-and-runtime-analysis-with-freertos/#more-23229

?

FreeRTOS操作系統(tǒng)的優(yōu)點之一是它提供了免費的性能分析:它向我們展示在每個任務(wù)中花費了多少時間。最好的是:它在Eclipse中也以圖形的方式顯示了相應內(nèi)容:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Eclipse中的FreeRTOS運行時信息

在上面的輸出中,我看到我的應用程序現(xiàn)在是97.5%的空閑,這是一件好事,符合我的期望,因為這個機器人正等待著在軌道上運行。

如何獲得這樣的信息?

在Eclipse中的圖形視圖中需要一個Eclipse插件(請參閱Eclipse中更好的FreeRTOS調(diào)試)。該插件已經(jīng)預先安裝在NXP MCUXpresso IDE中。

另一種查看該信息的方法是使用“tasklist”命令,該命令將輸出發(fā)送到控制臺(Segger RTT, UART, USB或類似的):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Tasklist命令

此命令可用于GitHub上的McuOnEclipse FreeRTOS。

如何工作的?

在每個任務(wù)切換時,FreeRTOS記錄會切換到該任務(wù)所傳遞的時間(或消耗的時間)。為此,它在任務(wù)信息結(jié)構(gòu)中使用了一個32位計數(shù)器。這實際上是在“運行時”列下的“任務(wù)列表”命令顯示的計數(shù)器。然后根據(jù)總運行時的總數(shù)來計算百分比。

FreeRTOS內(nèi)部的計數(shù)器值為32位,所以它不太適合長時間的測量。

為了修正這些數(shù)字,在FreeRTOSConfig.h中必須將兩個FreeRTOS配置定義為1。

#define configUSE_TRACE_FACILITY 1 /* 1: 包括額外的結(jié)構(gòu)成員和功能,以協(xié)助執(zhí)行可視化和跟蹤,0: 沒有運行時狀態(tài)跟蹤*/

#define configGENERATE_RUN_TIME_STATS 1 /* 1: 生成運行時統(tǒng)計; 0: 沒有運行時統(tǒng)計 */

如果使用處理器專家,上述兩個配置項有一個圖形化設(shè)置:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用于性能分析的處理器專家設(shè)置

計數(shù)器

如上所述:FreeRTOS記錄了每個任務(wù)所花費的時間。但這實際上不是實時的,如果configGENERATE_RUN_TIME_STATS打開,它只是某種計時器的計數(shù)器值。在這種情況下,FreeRTOSConfig。h需要配置有兩個應用程序功能配置的宏:

#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() AppConfigureTimerForRuntimeStats()

#define portGET_RUN_TIME_COUNTER_VALUE()???????? AppGetRuntimeCounterValueFromISR()

第一個是在RTOS啟動時配置timer,第二個是返回實際的計時器計數(shù)器值。

一般的經(jīng)驗法則是,用于測量任務(wù)的計時器應該比實際的滴答計數(shù)器快10倍。

處理器專家的用戶又有了一個優(yōu)勢:他們可以在處理器專家設(shè)置中輕松地配置這樣的計時器,并且一切都得到了處理:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FreeRTOS的處理器專家計時器

下面是一個計時器的設(shè)置,它的運行速度是1 kHz RTOS計時器的10倍。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?性能計數(shù)器

下面是產(chǎn)生的定時器代碼:

/*

** ===================================================================

**???? Method????? :? FRTOS1_OnCounterRestart (component FreeRTOS)

**

**???? Description :

**???????? This method is internal. It is used by Processor Expert only.

** ===================================================================

*/

void RTOSCNTRLDD1_OnCounterRestart(LDD_TUserData *UserDataPtr __attribute__((unused)))

{

? FRTOS1_RunTimeCounter++; /* increment runtime counter */

}

?

/*

** ===================================================================

**???? Method????? :? FRTOS1_AppConfigureTimerForRuntimeStats (component FreeRTOS)

**???? Description :

**???????? Configures the timer for generating runtime statistics

**???? Parameters ?: None

**???? Returns???? : Nothing

** ===================================================================

*/

#if configGENERATE_RUN_TIME_STATS

void FRTOS1_AppConfigureTimerForRuntimeStats(void)

{

#if configGENERATE_RUN_TIME_STATS_USE_TICKS

? /* nothing needed, the RTOS will initialize the tick counter */

#else

? FRTOS1_RunTimeCounter = 0;

? FRTOS1_RunTimeCounterHandle = RTOSCNTRLDD1_Init(NULL);

? (void)RTOSCNTRLDD1_Enable(FRTOS1_RunTimeCounterHandle);

#endif

}

?

#endif /* configGENERATE_RUN_TIME_STATS */

/*

** ===================================================================

**???? Method????? :? FRTOS1_AppGetRuntimeCounterValueFromISR (component FreeRTOS)

**???? Description :

**???????? returns the current runtime counter. Function can be called

**???? ????from an interrupt service routine.

**???? Parameters? : None

**???? Returns???? :

**???????? ---???????????? - runtime counter value

** ===================================================================

*/

uint32_t FRTOS1_AppGetRuntimeCounterValueFromISR(void)

{

#if configGENERATE_RUN_TIME_STATS

? #if configGENERATE_RUN_TIME_STATS_USE_TICKS

? return xTaskGetTickCountFromISR(); /* using RTOS tick counter */

#else /* using timer counter */

? return FRTOS1_RunTimeCounter;

? #endif

#else

? return 0; /* dummy value */

#endif

}

中斷服務(wù)例程計數(shù)一個計時器計數(shù)器,該計數(shù)器用于度量在任務(wù)中花費的時間。

如果中斷是從性能角度考慮的問題,并且不需要很高的精度,那么處理器專家端口就有一個很好的特性:它不使用專用計時器,而是重新使用RTOS的滴答計時器。為此,有一個額外的設(shè)置來配置這個:

#define configGENERATE_RUN_TIME_STATS_USE_TICKS 0 /* 1: 使用RTOS tick計數(shù)器作為運行時計數(shù)器。 0: 使用額外的

在UI中對應的設(shè)置如下:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?使用Tick計數(shù)器

有了這些,我們可以做一些基本的測量。但這不適合測量短任務(wù)執(zhí)行時間。說RTOS的計時器是1毫秒,那么運行不到1毫秒的任務(wù)將很少被測量。

使用ARM Cortex循環(huán)計數(shù)器

另一種在ARM Cortex M(例如:Cortex-M4或M7)上測量執(zhí)行時間的方法是使用ARM Cortex循環(huán)計數(shù)器。

#include "KIN1.h"

?

static uint32_t prevCycleCounter, cycleCntCounter = 0;

?

void AppConfigureTimerForRuntimeStats(void) {

? cycleCntCounter = 0;

? KIN1_InitCycleCounter();

? prevCycleCounter = KIN1_GetCycleCounter();

}

?

uint32_t AppGetRuntimeCounterValueFromISR(void) {

? uint32_t newCntr, diff;

?

? newCntr = KIN1_GetCycleCounter();

? diff = newCntr-prevCycleCounter;

? prevCycleCounter = newCntr;

? cycleCntCounter += diff>>12; /* scale down the counter */

? return cycleCntCounter;

}

這種方法測量循環(huán)計數(shù)器區(qū)別兩個調(diào)用AppGetRuntimeCounterValueFromISR()和基于價值的計數(shù)器計數(shù)。為了不過快地計算,計數(shù)器的值在上面的實現(xiàn)(使用120 MHz ARM的Cortex-M4)上按12位的偏移量縮小。對于運行速度更快或更慢的內(nèi)核,您可能需要調(diào)整該值。

總結(jié)

FreeRTOS具有跟蹤任務(wù)執(zhí)行時間的內(nèi)置函數(shù)。它是在每個任務(wù)描述符中使用一個計數(shù)器實現(xiàn)的,因此不需要太多RAM。應用程序必須提供一個計數(shù)器,其速度通常比正常情況下要快10倍,以獲得一些合理的測量值。但是,即使使用tick計數(shù)器本身也會給出一些粗略的性能分析數(shù)據(jù)。否則,應用程序可以提供一個定期計時器計數(shù)器。如果使用臂皮質(zhì)- m3 /M4/M7,使用手臂皮層循環(huán)計數(shù)器是另一種選擇,因為它不需要任何定時器或中斷。

歡迎關(guān)注:

總結(jié)

以上是生活随笔為你收集整理的使用FreeRTOS进行性能和运行时分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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