91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

perf_counter在測量系統(tǒng)的性能中有何作用?

嵌入式程序員 ? 來源:裸機(jī)思維 ? 作者:裸機(jī)思維 ? 2021-06-11 12:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

不知不覺中,perf_counter已經(jīng)經(jīng)歷了大大小小7個版本:

提高了delay_us()的精度

增加了對GCC、IAR的支持

改進(jìn)了__cycleof__()宏,使其支持嵌套、并不再強(qiáng)制綁定 printf()

如果你使用的是Arm Compiler5(armcc)或是Arm Compiler 6(armclang),移植就特別簡單。你可以按照這篇文章的手把手教程在5分鐘內(nèi)完成部署。

對于GCC和IAR來說,由于它們都不支持 Arm Compiler5/6 所特有的Linker語法——$Sub$$和$Super$$,因此無法直接通過 Lib 的方式實現(xiàn)對已有SysTick應(yīng)用的 “寄居”——這里就只能忍痛割愛了。 這并不影響我們以源代碼的形式將它們加入已有的 GCC 或是 IAR 工程。大體步驟如下: 第一步:將perf_counter.c和perf_counter.h拷貝到你的工程目錄下,并將perf_counter.c 加入到編譯列表中; 第二步:將perf_counter.h所在的路徑加入到編譯器的頭文件搜索路徑中;

第三步:perf_counter.c依賴CMSIS5.4.0及其以上版本,確保你的工程中正確的包含了對CMSIS的支持。(這里就不再贅述)。

第四步:在需要用到perf_counter功能的C源文件中加入對頭文件的包含:

#include "perf_counter.h"

第五步:一般來說,用戶會在某一個地方,比如main()函數(shù)內(nèi)完成對CPU工作頻率的配置,我們應(yīng)該在完成這一工作之后確保全局變量SystemCoreClock被正確的更新——保存當(dāng)前CPU的工作頻率,比如:

externuint32_tSystemCoreClock;voidmain(void){system_clock_update();//!更新CPU工作頻率SystemCoreClock=72000000ul//!假設(shè)更新后的系統(tǒng)頻率是 72MHz...}

一般來說,你的芯片工程如果本身都是基于較新的CMSIS框架而創(chuàng)建的,你的啟動文件中已經(jīng)為你定義好了全局變量SystemCoreClock——當(dāng)然,凡事都有例外,如果你在編譯的時候報告找不到變量SystemCoreClock或者說“Undefined symbol __SystemCoreClock” 之類的,你自己定義一下就好了,比如:

uint32_tSystemCoreClock;voidmain(void){system_clock_update();//!更新CPU工作頻率SystemCoreClock=72000000ul//!假設(shè)更新后的系統(tǒng)頻率是 72MHz...}

在這以后,我們需要對perf_counter庫進(jìn)行初始化。這里分兩種情況:

1、用戶自己的應(yīng)用里完全沒有使用SysTick。對于這種情況,我們要在 main.c (或者別的什么源文件里)添加一個SysTick中斷處理程序:

#include "perf_counter.h"... __attribute__((used))//!

然后我們在main()函數(shù)里初始化perf_counter服務(wù):

#include... voidmain(void){system_clock_update(); //!更新CPU工作頻率SystemCoreClock=72000000ul//!假設(shè)更新后的系統(tǒng)頻率是 72MHzinit_cycle_counter(false);...}

需要特別注意的是:由于用戶并沒有自己初始化SysTick,因此我們需要將這一情況告知perf_counter庫——由它來完成對SysTick的初始化——這里傳遞false給函數(shù)init_cycle_counter()就是這個功能。如果由perf_counter 庫自己來初始化SysTick,它會為了自己功能更可靠將 SysTick的溢出值(LOAD寄存器)設(shè)置為最大值(0x00FFFFFF)。

2、用戶自己的應(yīng)用里使用了SysTick,擁有自己的初始化過程。對于這種情況,我們需要確保一件事情:即,SysTick的CTRL寄存器的 BIT2(SysTick_CTRL_CLKSOURCE_Msk)是否被置位了——如果其值是1,說明SysTick使用了跟CPU一樣的工作頻率,那么SysTick的測量結(jié)果就是CPU的周期數(shù);如果其值是0,說明SysTick使用了來自于別處的時鐘源,這個時鐘源具體頻率是多少就只能看芯片手冊了(比如STM32就喜歡將系統(tǒng)頻率做 1/8 分頻后提供給SysTick作為時鐘源),此時SysTick測量出來的結(jié)果就不是CPU的周期數(shù)。

在確保了CTRL寄存器的BIT2被正確置位,并且SysTick中斷被使能(置位BIT1,SysTick_CTRL_TICKINT_Msk)后,我們可以簡單的通過init_cycle_counter()函數(shù)告訴perf_counter模塊:SysTick被用戶占用了——這里傳遞 true 就實現(xiàn)這一功能。

#include ... void main(void){ system_clock_update(); //! 更新CPU工作頻率 SystemCoreClock = 72000000ul //! 假設(shè)更新后的系統(tǒng)頻率是 72MHz init_cycle_counter(true); ...}

當(dāng)然,不要忘記向已經(jīng)存在的SysTick_Handler()內(nèi)加入perf_counter()的插入函數(shù):

#include "perf_counter.h"... __attribute__((used))//!

至此,我們就完成了perf_counter模塊在GCC和IAR中的部署。

如何測量代碼片斷占用了多少CPU資源?

很多時候,我們會關(guān)心某一段代碼或者函數(shù)究竟用了多少CPU周期,比如,我們寫了一個算法,你很擔(dān)心“這個算法究竟使用了多少CPU資源”,為了解決這個問題,我們需要用到如下的公式: CPU資源占用(百分比) = (函數(shù)運行所需的時間)(算法運行間隔的最小值) 100% 對于【函數(shù)運行所需的時間】和【算法運行間隔的最小值】來說,雖然它們都是時間單位,但考慮到CPU的頻率是給定的(不變的),因此,這里的時間單位在乘以CPU的工作頻率后都可以被換算為CPU的周期數(shù)。舉例來說,假如【算法運行間隔的最小值】是 20ms、CPU的頻率是72MHz,那么對應(yīng)的周期數(shù)就是 72000000* (20ms / 1000ms) = 1440000 個周期??磥砩鲜龉街形ㄒ恍枰覀儗嶋H測量的就是【函數(shù)運行所需的周期數(shù)】了。

perf_counter提供了一個非常簡單的運算符:__cycleof__()。假設(shè)我們要測量的代碼片斷如下:

...my_algorithm_step_a();my_algorithm_step_b();...my_algorithm_step_c();...則我們可以輕松的通過__cycleof__()運算來測量結(jié)果:

...__cycleof__("myalgorithm"){ my_algorithm_step_a(); my_algorithm_step_b(); ... my_algorithm_step_c();}...如果你的系統(tǒng)支持printf(),則可以看到類似如下的輸出結(jié)果:

poYBAGDC7bWAAtn6AABBJkEIg2I291.jpg

帶入上述公式:525139 /14400000 * 100% ≈36.5% 就計算出這個算法占用了大約36.5%的CPU資源,值得說明的是,從原理上看,這一方式對裸機(jī)和RTOS同樣有效哦。

有的小伙伴很快會說,我的系統(tǒng)并不允許我調(diào)用printf,那我還可以使用__cycleof__()么?當(dāng)然了!就繼續(xù)以上述代碼為例子:

int32_tnCycleUsed=0; ...__cycleof__("my algorithm", { nCycleUsed = _; }) { my_algorithm_step_a(); my_algorithm_step_b(); ... my_algorithm_step_c();}...這里的代碼所實現(xiàn)的功能是:

測量了用戶函數(shù)my_algorithm_step_xxx()所使用的周期數(shù):

測量的結(jié)果被轉(zhuǎn)存到了一個叫做nCycleUsed的變量中;

__cycleof__()將不會調(diào)用printf()進(jìn)行任何內(nèi)容輸出。

我相信很多小伙伴會揉了揉眼睛、仔細(xì)看了又看,然后回過頭來滿頭問號:

這是C語言? 這是什么語法? 不要懷疑,這就是C語言,只不過使用了一點GCC的語法擴(kuò)展(感興趣的小伙伴可以復(fù)制這里的連接https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs),考慮到本文只介紹perf_counter如何使用,而對其如何實現(xiàn)的并不關(guān)心,我們不妨略過GCC擴(kuò)展語法的部分,專門來看看上述代碼的使用細(xì)節(jié):

首先,為了方便大家觀察,我們先忽略圓括號內(nèi)的部分:

...__cycleof__(...){ my_algorithm_step_a(); my_algorithm_step_b(); ... my_algorithm_step_c();}...可以發(fā)現(xiàn),這里跟此前并沒有什么不同:花括號包圍的部分就是我們要測量的代碼片斷;

接下來,我們專門來看__cycleof__()圓括號中的部分:

int32_tnCycleUsed=0; ...__cycleof__("my algorithm", { nCycleUsed = _;}){...}...容易發(fā)現(xiàn),如果以“,” 為分隔符,那么實際傳遞給__cycleof__()的是兩個部分: 1、標(biāo)注測量名稱的字符串

"my algorithm"2、一段用花括號括起來的代碼片斷:

{nCycleUsed = _;}其中,nCycleUsed是一個事先已經(jīng)初始化好的變量。 這里,對于表示測量名稱的字符串"my algorithm",在這一用法下在最終的編譯結(jié)果里并不會占用任何RAM或者是ROM,但作為語法結(jié)構(gòu)是必須的。 對于花括號所囊括的代碼片段來說,實際上在這個花括號里,你幾乎可以為所欲為:

你可以寫任意數(shù)量的代碼

你可以調(diào)用函數(shù)

你可以定義變量(當(dāng)然這里定義變量肯定就是局部變量了)

但我們一般要做的事情其實是通過__cycleof__()所定義的一個局部變量"_"來獲取測量結(jié)果——這也是下面代碼的本意:

nCycleUsed = _;需要說明的是,這個局部變量"_"生命周期僅限于這個花括號中,因此不會影響 __cycleof__() 整個結(jié)構(gòu)之外的部分——或者說,下述代碼是沒有意義的:

int32_t nCycleUsed = 0; ...__cycleof__("my algorithm", { nCycleUsed = _; }) { my_algorithm_step_a(); my_algorithm_step_b(); ... my_algorithm_step_c();} printf("Cycle Used %d", _);編譯器會毫不客氣的告訴你 "_" 是一個未定義的變量,反之如果你這么做:

int32_t nCycleUsed = 0; ...__cycleof__("my algorithm", { nCycleUsed = _; printf("Cycle Used %d", _); }) { my_algorithm_step_a(); my_algorithm_step_b(); ... my_algorithm_step_c();}

則會看到你心怡的輸出結(jié)果:

pYYBAGDC7b2AR4b3AAAY48Xf9OE887.jpg

沒有什么黑魔法

如果你對上述例子的等效形式(展開形式)感到非常好奇,其實大可不必,上述代碼在“邏輯上等效”于如下的形式:

int32_t nCycleUsed = 0; ...do {int64_t_=get_system_ticks(); { my_algorithm_step_a(); my_algorithm_step_b(); ... my_algorithm_step_c(); } _ = get_system_ticks() - _; //!我們添加的代碼 nCycleUsed = _; printf("Cycle Used %d", _);}while(0);是不是突然就沒有那么神秘了?通過“邏輯等效”的形式展開,我們很容易發(fā)現(xiàn)一些有趣的內(nèi)容:

起核心作用的是一個叫做get_system_ticks()的函數(shù)。實際上它返回的是從復(fù)位后 SysTick被使能至今所經(jīng)歷的 CPU 周期數(shù)——由于它是int64_t 的類型,因此不用擔(dān)心超過 SysTick 24位計數(shù)器的量程,也不用擔(dān)心人類歷史范圍內(nèi)會發(fā)生溢出的可能。知道這一點后,聰明的小伙伴就可以自己整活兒了。

由于 "_"是一個局部變量,因此可以判斷__cycleof__() 是支持嵌套的。

需要特別說明的是,get_system_tick()函數(shù)自己也是有CPU時鐘開銷的,所以如果要獲得較為精確的結(jié)果,推薦通過下面的方法來獲取校準(zhǔn)值:

staticint64_ts_lPerfCalib; voidcalib_perf_counter(void){ int64_t lTemp = get_system_tick(); s_lPerfCalib = get_system_tick() - lTemp;} int64_tget_perf_counter_calib(void){return s_lPerfCalib;}具體如何使用,這里就不再贅述了。 說在后面的話。

perf_counter仍然在不停的演化中,這多虧了開源社區(qū)不斷的使用和反饋。perf_counter的應(yīng)用場景實際上非常廣泛,包括但不限于:

為裸機(jī)或者RTOS提供Cycle級別的性能測量;

評估代碼片段的CPU占用;

算法精細(xì)優(yōu)化時用于測量和觀察優(yōu)化的效果;

測量中斷的響應(yīng)時間;

測量中斷的發(fā)生間隔(查找最短時間間隔);

評估GUI的幀率或者刷新率;

與SystemCoreClock計算后,獲得一個系統(tǒng)時間戳(Timestamp);

當(dāng)做Realtime Clock的基準(zhǔn);

作為隨機(jī)數(shù)種子

……

實際上perf_counter在我參與的另外一個開源項目arm-2d里也被悄悄的藏在了platform_utilities.lib中用來為例子代碼提供幀率的測量服務(wù)。

責(zé)任編輯:lq6

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 測量系統(tǒng)
    +關(guān)注

    關(guān)注

    2

    文章

    580

    瀏覽量

    43369
  • Counter
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    18506

原文標(biāo)題:如何“優(yōu)雅”的測量系統(tǒng)性能

文章出處:【微信號:InterruptISR,微信公眾號:嵌入式程序員】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Ubuntu 24.04:“perf stat”報告未計算的事件是怎么回事?

    您好,我正在嘗試對硬件事件進(jìn)行采樣,如下所示,但對于每個事件(例如 “perf event -e LLC-loads benchmark”),我從 perf 中得到“未計算”。我已在 NVMe
    發(fā)表于 02-05 07:37

    高程數(shù)據(jù)自動駕駛中有什么作用?

    最近有小伙伴讓智駕最前沿聊聊自動駕駛高精度地圖對高程數(shù)據(jù)的使用依賴,其實在聊這個話題之前,還是需要先知道高程數(shù)據(jù)是什么,自動駕駛中到底有什么作用
    的頭像 發(fā)表于 11-02 13:44 ?1794次閱讀

    空氣溫度測量裝置的主要作用是什么?有品牌推薦?

    隨著氣象學(xué)的發(fā)展,氣象站遍布全球,對空氣溫度的觀測更加系統(tǒng)和準(zhǔn)確,市面上可供選擇的空氣溫度測量儀器種類也越來越豐富。那么,空氣溫度測量裝置的主要作用是什么?有
    發(fā)表于 10-20 16:24

    溫度測量儀器有哪些?有品牌推薦?

    溫度測量儀,是一種通過物理原理將溫度變化轉(zhuǎn)化為可量化信號的裝置,主要原理包括熱脹冷縮、氣體壓強(qiáng)變化、熱電效應(yīng)等。那么,溫度測量儀器有哪些?有品牌推薦?為方便大家了解,接下來就讓小編來為大家簡單介紹
    發(fā)表于 09-08 14:04

    什么是Wi-Fi 6 技術(shù),人們生活中有哪些便利應(yīng)用

    silex希來科告訴您什么是Wi-Fi 6 技術(shù),人們生活中有哪些便利應(yīng)用
    的頭像 發(fā)表于 08-28 09:19 ?1084次閱讀
    什么是Wi-Fi 6 技術(shù),<b class='flag-5'>在</b>人們生活<b class='flag-5'>中有</b>哪些便利應(yīng)用

    Vector CSM測量系統(tǒng)起重機(jī)中的應(yīng)用案例

    為了驗證零部件的安全性與結(jié)構(gòu)設(shè)計的合理性,通常需通過多項測試來評估其性能。在這些測試中,部分零部件將承受直至破壞的極限載荷。這一方法對于承受高機(jī)械負(fù)載的部件尤為重要,例如商用車輛和工程車輛。通常使用應(yīng)變片來測量作用在零部件上的力
    的頭像 發(fā)表于 08-08 14:21 ?2079次閱讀
    Vector CSM<b class='flag-5'>測量</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>在</b>起重機(jī)中的應(yīng)用案例

    PCIe協(xié)議分析儀在數(shù)據(jù)中心中有作用?

    升數(shù)據(jù)中心的整體可靠性。以下是其核心作用及具體應(yīng)用場景的詳細(xì)分析:一、性能優(yōu)化:突破帶寬瓶頸,提升計算效率 鏈路帶寬利用率分析 場景:AI訓(xùn)練集群中,GPU通過PCIe與CPU交換數(shù)據(jù),若帶寬利用率低
    發(fā)表于 07-29 15:02

    四探針法丨導(dǎo)電薄膜薄層電阻的精確測量、性能驗證與創(chuàng)新應(yīng)用

    系統(tǒng)探討四探針法的測量原理、優(yōu)化策略及其新型導(dǎo)電薄膜研究中的應(yīng)用,并結(jié)合FlexFilm半導(dǎo)體量測裝備及光伏電池電阻檢測系統(tǒng)的技術(shù)積累,
    的頭像 發(fā)表于 07-22 09:52 ?1244次閱讀
    四探針法丨導(dǎo)電薄膜薄層電阻的精確<b class='flag-5'>測量</b>、<b class='flag-5'>性能</b>驗證與創(chuàng)新應(yīng)用

    毫米波雷達(dá)自動駕駛中有關(guān)鍵作用?

    其中毫米波雷達(dá)(Millimeter-Wave Radar)以卓越的抗干擾能力、全天候測距性能和豐富的目標(biāo)運動信息,成為自動駕駛感知系統(tǒng)中的核心組件之一。相較于激光雷達(dá)與攝像頭,毫米波雷達(dá)的關(guān)注度似乎并非那么高,但其作用卻無可替
    的頭像 發(fā)表于 06-28 13:59 ?1491次閱讀
    毫米波雷達(dá)<b class='flag-5'>在</b>自動駕駛<b class='flag-5'>中有</b><b class='flag-5'>何</b>關(guān)鍵<b class='flag-5'>作用</b>?

    安泰:水聲功率放大器聲吶系統(tǒng)中有哪些作用

    水聲功率放大器聲吶系統(tǒng)中發(fā)揮著至關(guān)重要的作用,以下是其具體作用的詳細(xì)介紹: 信號發(fā)射方面 增強(qiáng)發(fā)射信號強(qiáng)度:聲吶系統(tǒng)通過發(fā)射聲波信號來探測
    的頭像 發(fā)表于 06-11 15:17 ?685次閱讀
    安泰:水聲功率放大器<b class='flag-5'>在</b>聲吶<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>中有</b>哪些<b class='flag-5'>作用</b>

    拆解小米 CyberGear 微電機(jī)!ams AS5047P 磁編憑性能狂飆?

    《拆解小米 CyberGear 微電機(jī)!ams AS5047P 磁編憑性能狂飆?》
    的頭像 發(fā)表于 05-14 10:45 ?1229次閱讀
    拆解小米 CyberGear 微電機(jī)!ams AS5047P 磁編憑<b class='flag-5'>何</b>讓<b class='flag-5'>性能</b>狂飆?

    時鐘同步通信系統(tǒng)中有哪些重要作用?

    時鐘同步是指在一個系統(tǒng)中,各個時鐘能夠準(zhǔn)確地顯示相同的時間。現(xiàn)代科技發(fā)展中,時鐘同步是非常重要的,特別是計算機(jī)網(wǎng)絡(luò)和通信系統(tǒng)中。計算機(jī)
    的頭像 發(fā)表于 04-29 13:44 ?1127次閱讀
    時鐘同步<b class='flag-5'>在</b>通信<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>中有</b>哪些重要<b class='flag-5'>作用</b>?

    模擬示波器信號處理實驗中有哪些應(yīng)用?

    模擬示波器信號處理實驗中具有廣泛的應(yīng)用,主要體現(xiàn)在以下幾個方面:一、信號觀測與基本特性分析 波形顯示: 模擬示波器能夠直觀地顯示電信號的波形,包括正弦波、方波、三角波等,幫助實驗者觀察信號的形態(tài)
    發(fā)表于 04-01 15:01

    四探針電極多功能壓力測量系統(tǒng)中的原理與應(yīng)用

    一、引言 多功能壓力測量系統(tǒng)里,四探針電極以其獨特測量原理,助力獲取材料電學(xué)性能與壓力的關(guān)聯(lián)數(shù)據(jù)。它在材料科學(xué)、電子工程等領(lǐng)域應(yīng)用廣泛,有
    的頭像 發(fā)表于 03-27 14:04 ?1096次閱讀
    四探針電極<b class='flag-5'>在</b>多功能壓力<b class='flag-5'>測量</b><b class='flag-5'>系統(tǒng)</b>中的原理與應(yīng)用

    PoE交換機(jī)安防監(jiān)控系統(tǒng)中的關(guān)鍵作用

    高速數(shù)據(jù)連接 現(xiàn)代安全和監(jiān)控系統(tǒng)中,建立高速數(shù)據(jù)連接對于整個網(wǎng)絡(luò)中有效傳輸監(jiān)控錄像和安全數(shù)據(jù)至關(guān)重要。PoE交換機(jī)實現(xiàn)這種平穩(wěn)
    發(fā)表于 03-24 16:41