一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

測量ARM Cortex-M MCU上的代碼執(zhí)行時間

星星科技指導員 ? 來源:嵌入式計算設(shè)計 ? 作者:Jean Labrosse ? 2022-06-08 16:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在許多實時應(yīng)用程序中,CPU 可以在不到 5% 的代碼中花費 95%(或更多)的時間。電機控制、發(fā)動機控制、無線通信和許多其他對時間敏感的應(yīng)用就是這種情況。這些嵌入式系統(tǒng)通常是用 C 語言編寫的,并且開發(fā)人員經(jīng)常被迫手動優(yōu)化代碼,可能會恢復為匯編語言,以滿足緊迫的期限。測量部分代碼的實際執(zhí)行時間可以幫助您找到代碼中的熱點。本文將展示如何輕松測量和顯示實時基于 Cortex-M 的 MCU 上的代碼執(zhí)行時間。

測量代碼的執(zhí)行時間

有很多方法可以測量代碼執(zhí)行時間。作為一名嵌入式工程師,我經(jīng)常使用一個或多個數(shù)字輸出和示波器。您只需在執(zhí)行要監(jiān)視的代碼之前將其中一個輸出設(shè)置為高電平,然后再將輸出設(shè)置為低電平。當然,在您執(zhí)行此操作之前還有相當多的設(shè)置工作:找到一個或多個空閑輸出,確保它們易于探測,將端口配置為輸出,編寫代碼,編譯,設(shè)置范圍等等。 收到信號后,您可能需要對其進行一段時間的監(jiān)控以查看最小值和最大值。數(shù)字存儲示波器使這個過程更容易,但還有其他方法比這更容易。

測量執(zhí)行時間的另一種方法是使用具有跟蹤功能的調(diào)試探針。您只需運行代碼、查看跟蹤、計算增量時間(通常是手動)并將 CPU 周期轉(zhuǎn)換為微秒。不幸的是,跟蹤為您提供了一個執(zhí)行實例,您可能需要進一步查看跟蹤捕獲以找到最壞情況下的執(zhí)行時間。這可能是一個乏味的過程。

Cortex-M 周期計數(shù)器

大多數(shù)基于 Cortex-M 的處理器上的 CoreSight 調(diào)試端口都包含一個 32 位自由運行計數(shù)器,用于計算 CPU 時鐘周期。該計數(shù)器是調(diào)試監(jiān)視和跟蹤 (DWT) 模塊的一部分,可輕松用于測量代碼的執(zhí)行時間。以下代碼是啟用和初始化這個非常有用的功能所需的全部內(nèi)容。

#define ARM_CM_DEMCR (*(uint32_t *)0xE000EDFC)

#define ARM_CM_DWT_CTRL (*(uint32_t *)0xE0001000)

#define ARM_CM_DWT_CYCCNT (*(uint32_t *)0xE0001004)

if (ARM_CM_DWT_CTRL != 0) { // 看看

DWTDEMCR是否可用 ARM = 1 《《 24; // 設(shè)置位 24

ARM_CM_DWT_CYCCNT = 0;

ARM_CM_DWT_CTRL |= 1 《《 0; // 設(shè)置位 0

}

使用 DWT 循環(huán)計數(shù)器測量代碼執(zhí)行時間

您可以通過讀取該段之前和之后的循環(huán)計數(shù)器的值來測量和計算代碼段的執(zhí)行時間,如下所示。當然,這意味著您必須檢測您的代碼,但您會得到一個非常準確的值。

uint32_t 開始;

uint32_t 停止;

uint32_t 增量;

開始 = ARM_CM_DWT_CYCCNT;

// 測量

停止的代碼 = ARM_CM_DWT_CYCCNT;

delta = 停止 - 開始;

因為我們使用的是無符號數(shù)學,所以 delta 表示測量代碼的實際執(zhí)行時間(以 CPU 時鐘周期為單位),即即使 stop 小于 start。

當然,在測量開始和停止讀數(shù)之間括起來的代碼的執(zhí)行時間時可能會發(fā)生中斷,因此每次執(zhí)行此序列時很可能會有不同的值。在這種情況下,您可能希望在測量期間禁用中斷以刪除該偽影,如下所示,但要了解禁用中斷是暫時的,并且僅包含在測量中。話雖如此,包含中斷的工件可能會很有用,因為它們會影響代碼的截止日期。

禁用中斷;

開始 = ARM_CM_DWT_CYCCNT;

// 測量

停止的代碼 = ARM_CM_DWT_CYCCNT;

啟用中斷;

delta = 停止 - 開始;

如果被測量的代碼包含條件語句、循環(huán)或任何可能導致變化的東西,那么獲得的值可能不代表最壞情況下的執(zhí)行時間。要糾正這個問題,您可以簡單地添加一個峰值檢測器,如下所示。當然,在進行任何測量之前,需要聲明 max 并將其初始化為最小值(即 0)。

開始 = ARM_CM_DWT_CYCCNT;

// 測量

停止的代碼 = ARM_CM_DWT_CYCCNT;

delta = 停止 - 開始;

if (max 《 delta) {

max = delta;

}

同樣,了解最短執(zhí)行時間也可能很有趣且有用。在進行任何測量之前,只需聲明 min 并將其初始化為最大可能值(即 0xFFFFFFFF)。這是新代碼:

開始 = ARM_CM_DWT_CYCCNT;

// 測量

停止的代碼 = ARM_CM_DWT_CYCCNT;

delta = 停止 - 開始;

if (max 《 delta) {

max = delta;

}

if (min 》 delta) {

min = delta;

}

執(zhí)行時間還取決于 CPU 是否配備高速緩存,就像某些 Cortex-M4 處理器和 Cortex-M7 一樣。如果您的系統(tǒng)使用指令或數(shù)據(jù)緩存,則同一段代碼的多次測量可能會不一致。您可能會考慮禁用緩存以測量最壞的情況。

為了顯示這些值,大多數(shù)調(diào)試器允許您實時顯示這些變量值。如果是這種情況,則需要在全局范圍內(nèi)聲明顯示的變量以保留其值并允許實時監(jiān)控。此外,不幸的是,這些值代表 CPU 時鐘周期,并且大多數(shù)調(diào)試器都不夠復雜,無法縮放變量以用于顯示目的。假設(shè) CPU 時鐘速度為 16 MHz,顯示 70.19 微秒比顯示 1123 個周期要方便得多。實際上有一種更好的方法來顯示實時變量,它還提供了縮放值的能力,因此您可以以更易讀的形式查看它們。我將很快解釋如何做到這一點。

經(jīng)過時間模塊

您當然可以將代碼片段添加到您的應(yīng)用程序中,或者您可以使用我編寫的一個簡單模塊(包含在本文中)。與 elapsed_time.h 模塊一起出現(xiàn)在下方的“elapsed_time.c”模塊僅包含 4 個函數(shù)。

要使用:

只需#include

在使用 elapsed_time.c 中定義的其他函數(shù)之前調(diào)用 elapsed_time_init()。

通過設(shè)置 ELAPSED_TIME_MAX_SECTIONS 定義經(jīng)過時間測量結(jié)構(gòu)的最大數(shù)量。這對應(yīng)于您要使用停止/啟動代碼包裝的不同代碼片段的數(shù)量。

調(diào)用 elapsed_time_start() 并將您要監(jiān)視的代碼片段的索引傳遞給它(即 0 。. ELAPSED_TIME_MAX_SECTIONS-1)。

調(diào)用 elapsed_time_stop() 并將您在 elapsed_time_start() 調(diào)用中使用的索引傳遞給它。

如果您的調(diào)試器允許您實時監(jiān)控變量(即在目標運行時),您可以顯示 elapsed_time_tbl[] 并查看您使用的相應(yīng)索引的 ELAPSED_TIME 結(jié)構(gòu)。

重復執(zhí)行第 4 步到第 6 步,并讓您的代碼處于最壞和最好的情況下,以便 ELAPSED_TIME 結(jié)構(gòu)的 .min 和 .max 字段很好地表示您正在測量的代碼片段的執(zhí)行時間。

您會注意到(請參閱 elapsed_time.c)我在測量期間沒有禁用中斷,因為可能涉及 ISR,您可能想知道這如何影響感知的執(zhí)行時間。

void main (void)

{

// 一些代碼

elapsed_time_init(); // 初始化模塊

// 一些代碼

}

void MyCode (void)

{

// 這里的一些代碼

elapsed_time_start(0); // 開始測量代碼片段 #0

// 正在測量的代碼

elapsed_time_stop(0); // 停止和

// 一些其他代碼

}

當然,最小和最大執(zhí)行時間取決于您進行測量的頻率以及代碼是否分別受制于其最佳和最差條件。

elapsed_time_tbl[] 中的字段可以使用 Silicon Labs 的 Micrium uC/Probe 顯示。事實上,uC/Probe 可以顯示每個字段并縮放每個值,以便可以將 CPU 時鐘周期轉(zhuǎn)換為微秒,這更加友好。與大多數(shù) Cortex-M MCU 內(nèi)置的 CoreSight 調(diào)試端口連接時,uC/Probe 不需要對您的代碼進行任何檢測。

附帶說明一下,不需要顯示起始字段,因為它僅用于記錄測量開始時 DWT 循環(huán)計數(shù)器的值。但是,開始字段可用于顯示活動。換句話說,當您看到此值發(fā)生變化時,您就會知道正在進行測量。

使用 uC/Probe 的示例顯示

我將 elapsed_time.c 模塊與 uC/Probe 結(jié)合使用,并測量了四個代碼片段的執(zhí)行時間。

圖 1 顯示了使用 IAR 的 LiveWatch(左)和 uC/Probe 的 Tree View 控件(右)的原始形式的值。請注意,屏幕截圖是在不同時間拍攝的。elapsed_time_tbl[] 是一個數(shù)組,用于存儲不同代碼片段的測量值。

圖 1,IAR 和 uC/Probe 的樹形視圖控件。

您還可以將最小/最大/當前值分配給儀表和數(shù)字指示器,如圖 2 所示。在這里,這些值以微秒為單位顯示,因為我應(yīng)用了 0.0125 的縮放因子,CPU 以 80 MHz 運行。我還決定只顯示最大執(zhí)行時間。左側(cè)的按鈕用于重置統(tǒng)計信息,從而強制重新計算最小值和最大值。

【圖2 | 使用 uC/Probe 的儀表之一顯示最大執(zhí)行時間。]

uC/Probe 非常強大的功能之一是能夠與 Microsoft 的 Excel 交互,從而在電子表格上顯示值(實時),如圖 3 所示。

【圖3 | 使用 Excel 顯示實時數(shù)據(jù)。]

概括

作為嵌入式開發(fā)人員,我們有很多工具可以用來測試和驗證我們的設(shè)計。我已經(jīng)演示了使用 Cortex-M 處理器的眾多功能之一是多么容易,即 DWT 循環(huán)計數(shù)器。

Micrium 的 uC/Probe 提供了許多功能,允許您使用儀表、儀表、數(shù)字指示器、Excel 界面或圖形/繪圖來監(jiān)控應(yīng)用程序中的許多變量。憑借其內(nèi)置的示波器功能,一旦滿足觸發(fā)條件,您還可以捕獲多達七個附加變量的值。

隨意使用或改進 elapsed_time.* 模塊。不要猶豫,向我發(fā)送反饋。我考慮添加的另一個功能是在最大執(zhí)行時間超過閾值時調(diào)用的回調(diào)函數(shù)。如果您想在這種情況發(fā)生時立即收到通知(打開 LED、發(fā)出警報等),這可能很有用。事實上,您甚至可以設(shè)置一個斷點,以防您想查看是什么條件導致超過閾值。

審核編輯:郭婷

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

    關(guān)注

    68

    文章

    19881

    瀏覽量

    234827
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23824

    瀏覽量

    673427
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2291

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    Analog Devices Inc. MAX32675C超低功耗Arm? Cortex?-M4F MCU數(shù)據(jù)手冊

    MCU基于帶浮點單元(FPU)的超低功耗Arm Cortex- M4,包括384KB(376KB用戶)閃存和160KB SRAM。在整個閃存、SRAM和緩存
    的頭像 發(fā)表于 06-03 10:04 ?244次閱讀
    Analog Devices Inc. MAX32675C超低功耗<b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>4F <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

    PPEC新品發(fā)布丨圖形化編程數(shù)字電源專用 ARM Cortex-M4 MCU

    痛點。該芯片基于120MHz主頻Cortex-M4內(nèi)核,集成高精度PWM、多協(xié)議通信接口等豐富資源。在硬件設(shè)計,采用LQFP64封裝,兼容主流ARM芯片引腳布局
    的頭像 發(fā)表于 05-22 17:30 ?460次閱讀
    PPEC新品發(fā)布丨圖形化編程數(shù)字電源專用 <b class='flag-5'>ARM</b> <b class='flag-5'>Cortex-M</b>4 <b class='flag-5'>MCU</b>

    tc397如何高精度(微秒級別)測量代碼執(zhí)行時間

    tc397如何高精度(微秒級別)測量代碼執(zhí)行時間
    發(fā)表于 04-21 07:31

    MSPM0G1505 80MHz Arm? Cortex-M0?+ MCU數(shù)據(jù)手冊

    MSPM0G150x 微控制器 (MCU) 是 MSP 高度集成、超低功耗 32 位 MCU 系列的一部分,該系列基于增強型 Arm Cortex-M0+ 32 位內(nèi)核平臺,運行頻率高
    的頭像 發(fā)表于 04-15 14:08 ?424次閱讀
    MSPM0G1505 80MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

    MSPM0G3106 80MHz Arm? Cortex-M0?+ MCU數(shù)據(jù)手冊

    MSPM0G310x 微控制器 (MCU) 是 MSP 高度集成、超低功耗 32 位 MCU 系列的一部分,基于增強型 Arm Cortex-M0+ 32 位內(nèi)核平臺,運行頻率高達 8
    的頭像 發(fā)表于 04-15 11:44 ?440次閱讀
    MSPM0G3106 80MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

    MSPM0G3107-Q1 汽車級 80MHz Arm? Cortex-M0?+ MCU技術(shù)手冊

    MSPM0G310x 微控制器 (MCU) 是 MSP 高度集成、超低功耗 32 位 MCU 系列的一部分,基于增強型 Arm Cortex-M0+ 32 位內(nèi)核平臺,工作頻率高達 8
    的頭像 發(fā)表于 04-15 10:13 ?479次閱讀
    MSPM0G3107-Q1 汽車級 80MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>技術(shù)手冊

    MSPM0C1103 24MHz Arm? Cortex-M0?+ MCU數(shù)據(jù)手冊

    MSPM0C110x 微控制器 (MCU) 是 MSP 高度集成的超低功耗 32 位 MCU 系列的一部分,基于增強型 Arm Cortex-M0+ 內(nèi)核平臺,運行頻率高達 24MHz
    的頭像 發(fā)表于 04-15 09:39 ?478次閱讀
    MSPM0C1103 24MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

    MSPM0G3505-Q1 汽車級 80MHz Arm? Cortex-M0?+ MCU數(shù)據(jù)手冊

    MSPM0G350x 微控制器 (MCU) 是 MSP 高度集成、超低功耗 32 位 MCU 系列的一部分,基于增強型 Arm Cortex-M0+ 32 位內(nèi)核平臺,運行頻率高達 8
    的頭像 發(fā)表于 04-14 16:52 ?436次閱讀
    MSPM0G3505-Q1 汽車級 80MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

    MSPM0C1104-Q1 汽車級 24MHz Arm? Cortex-M0?+ MCU數(shù)據(jù)手冊

    MSPM0C110x 微控制器 (MCU) 是 MSP 高度集成的超低功耗 32 位 MCU 系列的一部分,基于增強型 Arm Cortex-M0+ 內(nèi)核平臺,運行頻率高達 24MHz
    的頭像 發(fā)表于 04-14 15:48 ?498次閱讀
    MSPM0C1104-Q1 汽車級 24MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

    充電樁CCC認證什么時候執(zhí)行?

    充電樁CCC認證的執(zhí)行時間表如下:
    的頭像 發(fā)表于 12-25 17:12 ?798次閱讀

    如何使用Ozone分析Cortex-M異常

    Ozone可以幫助用戶快速分析和查找導致CPU故障的軟件bug。本文解釋如何使用Ozone的調(diào)試功能,深入了解Cortex-M架構(gòu)的這些錯誤。
    的頭像 發(fā)表于 11-29 11:14 ?1660次閱讀
    如何使用Ozone分析<b class='flag-5'>Cortex-M</b>異常

    MAX32675C超低功耗Arm? Cortex?-M4F MCU

    檢測(SEC-DED),確保為要求苛刻的應(yīng)用提供超可靠的代碼執(zhí)行。 *附件:MAX32675C超低功耗Arm? Cortex?-M4F
    的頭像 發(fā)表于 11-28 11:50 ?1068次閱讀
    MAX32675C超低功耗<b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>4F <b class='flag-5'>MCU</b>

    【RA-Eco-RA2E1-48PIN-V1.0開發(fā)板試用】原創(chuàng)測量代碼行時間

    應(yīng)用在所有Cortex-M處理器,不限內(nèi)核版本。 加入keil工程 添加文件目錄 在hal_entry()里面添加如下函數(shù)代碼 while里面實現(xiàn)流水燈,同時測量流水燈
    發(fā)表于 11-06 15:32

    實際項目開發(fā)中為何選擇ARM? Cortex?-M4 內(nèi)核的HK32MCU?

    ?Cortex?-M4內(nèi)核的HK32F407芯片的深度知識,并圍繞各類實際案例詳細解讀了如何選型,為何選擇ARM?Cortex?-M4內(nèi)核的
    的頭像 發(fā)表于 10-22 17:19 ?876次閱讀
    實際項目開發(fā)中為何選擇<b class='flag-5'>ARM</b>? <b class='flag-5'>Cortex</b>?-<b class='flag-5'>M</b>4 內(nèi)核的HK32<b class='flag-5'>MCU</b>?

    基于瑞薩Arm Cortex-M85 MCU Feather SOM的解決方案

    開源社區(qū)已經(jīng)從傳統(tǒng)的黑客聚集地逐漸擴展到家庭、辦公室以及工業(yè)應(yīng)用等廣泛領(lǐng)域。在這個過程中,瑞薩的Arm Cortex-M85 MCU Feather SOM憑借著卓越的性能和豐富的功能,為開源硬件愛好者和專業(yè)開發(fā)者提供了強大的支
    的頭像 發(fā)表于 08-19 17:32 ?861次閱讀