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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

大多數(shù)基于 Cortex-M 的處理器上的 CoreSight 調試端口都包含一個 32 位自由運行計數(shù)器,用于計算 CPU 時鐘周期。該計數(shù)器是調試監(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; // 設置位 24

ARM_CM_DWT_CYCCNT = 0;

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

經(jīng)過時間模塊

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

要使用:

只需#include

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

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

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

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

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

重復執(zhí)行第 4 步到第 6 步,并讓您的代碼處于最壞和最好的情況下,以便 ELAPSED_TIME 結構的 .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 時鐘周期轉換為微秒,這更加友好。與大多數(shù) Cortex-M MCU 內(nèi)置的 CoreSight 調試端口連接時,uC/Probe 不需要對您的代碼進行任何檢測。

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

使用 uC/Probe 的示例顯示

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

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

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

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

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

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

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

概括

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

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

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

審核編輯:郭婷

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

    關注

    68

    文章

    20255

    瀏覽量

    252348
  • led
    led
    +關注

    關注

    243

    文章

    24596

    瀏覽量

    690918
  • 計數(shù)器
    +關注

    關注

    32

    文章

    2316

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    最小化ARM Cortex-M CPU功耗的方法與技巧分享

    ,并且為原始性能和整體代碼大小提供了靈活的解決方案。在Cortex-M內(nèi)核上一個典型的Thumb-2應用程序與完全采用ARM指令完成的相同功能應用程序相比,代碼大小減小到25%之內(nèi),而
    發(fā)表于 01-21 06:19

    探索MCXA345/346:混合信號Arm Cortex - M33 MCU的卓越性能與應用潛力

    探索MCXA345/346:混合信號Arm Cortex - M33 MCU的卓越性能與應用潛力 在當今電子科技飛速發(fā)展的時代,微控制器(MCU
    的頭像 發(fā)表于 12-24 11:00 ?568次閱讀

    探秘NXP MCXE315/316/317/31B:5V Arm Cortex M7 MCU的卓越性能與應用潛力

    MCX E31微控制器(MCU).pdf 一、概述:強大性能與廣泛應用的完美結合 MCXE31系列是NXP在商業(yè)和工業(yè)領域的一次重要拓展,它在Arm Cortex - M4F MCX
    的頭像 發(fā)表于 12-24 10:20 ?436次閱讀

    探秘MCXE315/316/317/31B:5V強勁Arm Cortex M7 MCU的卓越性能

    探秘MCXE315/316/317/31B:5V強勁Arm Cortex M7 MCU的卓越性能 在電子工程師的世界里,不斷尋求高性能、高可靠性的微控制器(
    的頭像 發(fā)表于 12-24 10:20 ?550次閱讀

    Cortex-M產(chǎn)品的特色

    與外部設備進行通信。 指令集:Cortex-M系列處理器支持ARM Thumb指令集,包括16位和32位的Thumb-2指令集,以及可選的DSP指令和浮點單元,提供了高性能的信號處理能力
    發(fā)表于 11-26 07:22

    Cortex-M內(nèi)核中的精確延時的方法

    使用 CYCCNT寄存器來測量執(zhí)行某個任務所花的周期數(shù),這也可以用作時間基準相關的目的(操作系統(tǒng)中統(tǒng)計 CPU使用率可以用到它)?!?Cortex-M中的DWT它有一個32位的寄存器叫
    發(fā)表于 11-21 07:51

    Cortex-M級別的轉換

    一、 簡述 Cortex-M 里面有特權級別的概念,不同級別可以設定不同的權限,如何轉換特權級別基本是本章的內(nèi)容。 二、操作模式 ARM M 核操作模式有兩個: 線程(Thread)模式:在復位時或
    發(fā)表于 11-19 07:32

    MSPM0G1507 80MHz Arm? Cortex-M0?+ MCU技術手冊

    MSPM0G150x 微控制器 (MCU) 是 MSP 高度集成、超低功耗 32 位 MCU 系列的一部分,基于增強型 Arm Cortex-M0+ 32 位核心平臺,工作頻率高達 8
    的頭像 發(fā)表于 09-30 09:08 ?898次閱讀
    MSPM0G1507 80MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>技術手冊

    【RA-Eco-RA6M4開發(fā)板評測】使用ULINK2開發(fā)瑞薩MCU

    · 支持 ARM7、ARM9、Cortex-M、8051 和 C166 設備 · JTAG 速度高達 10MHz · 針對基于 ARM Corte
    發(fā)表于 09-25 23:08

    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 ?986次閱讀
    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é)議通信接口等豐富資源。在硬件設計,采用LQFP64封裝,兼容主流ARM芯片引腳布局
    的頭像 發(fā)表于 05-22 17:30 ?1338次閱讀
    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 ?1200次閱讀
    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 ?1202次閱讀
    MSPM0G3106 80MHz <b class='flag-5'>Arm</b>? <b class='flag-5'>Cortex-M</b>0?+ <b class='flag-5'>MCU</b>數(shù)據(jù)手冊

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

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