一、文檔背景
所有的軟件都是為了完成某些功能,當我們在設計一個項目產品功能的時候,勢必要考慮系統的反應速度。在硬件固定的情況下,軟件的時效性就決定著系統的反應速度了。我們大部分任務都采用一種輪詢或者是監控的狀態,如果一個任務占據了太長的 CPU 時間,就會帶來整個系統的延時,特別是在多任務的 RTOS 系統中,如果有時候任務時間太長,就導致總系統達不到我們的預期,那么我們就需要非常清楚地知道我們的任務到底運行了多少時間。
二、 實現 記錄函數執行時間的思路
事件記錄器為應用程序代碼中的事件注釋提供了API接口(函數調用)。這些功能不僅記錄事件本身,還記錄了時間戳和附加信息。數據存儲在目標硬件的RAM中的事件緩沖區中。
1. 添加Event Recorder組件
本次使用的是CMSIS-View組件,不是采用的compiler。在Keil MDK中,可以通過管理運行時環境來啟用EventRecorder功能。
2. 配置Event Recorder組件
在EventRecorderConf.h文件中進行以下配置:
○ EVENT_RECORD_COUNT設置記錄數量。
○ EVENT_TIMESTAMP_SOURCE選擇時間戳來源。
○ EVENT_TIMESTAMP_FREQ設定時鐘頻率。
○ 內存設置
為Event Recorder組件分配所需的內存。所需RAM大小計算公式為:164 + 16 * <記錄數>。此外,還需將EventRecorder信息數據段之外的內存初始化為0。
○ 在代碼中集成Event Recorder
在代碼中添加以下相關函數調用:
○ EventRecorderInitialize(uint32_t recording, uint32_t start):初始化事件記錄器。
○ EventStartA(slot)開始記錄事件。
○ EventStopA(slot)停止記錄事件。
通過在函數的開始位置調用EventStartA(slot),并在結束位置調用EventStopA(slot),可以記錄函數的執行時間。
○ 編譯與調試工程
編譯完成后,進入調試界面,找到“Event Statistics”視圖,查看函數執行時間的平均值、最小值、最大值、開始時間和結束時間。
三、 如何在STM32F746實現記錄函數執行時間
1. 選用STM32F746 中自帶的 Blink 示例進行測試。
編譯例程,并下載到目標板中,測試 LED 燈可以正常閃爍,保證程序編譯和下載都可以正確執行。
2. 添加Event Recorder 組件。
如圖 1 所示,打開 Manage Run-time Enviroment ,展開 CMSIS-View勾選 Event Recorder 并點擊 OK

圖 1
如圖 2 所示,可以看到工程中添加了EventRecorder.c 和 EventRecorderConf.h 兩個文件。

圖 2
3. 配置Event Recorder
如圖 3 所示,打開EventRecorderConf.h 文件,點擊底部的 Configuration Wizard。
在圖形界面中點擊 Expand All,展開Event Recorder 的配置參數。
這里我們只更改一下 Time Stamp Clock Frequency,如圖 4 更改為 216000000

圖 3

圖 4
4. 內存設置
如圖 5,點擊 Option for Taget ... ,選擇 Target 標簽,在 RAM 設置區域,更改為圖中所示內容。

圖 5
5. 添加Event Recorder 相關代碼
在 main.c 中包含 EventRecorder.h 頭文件

圖 6
在 main 函數中對EventRecorder 進行初始化

圖 7
在 Blinky.c中包含 EventRecorder.h 頭文件

圖 8
在thrLED 函數中增加EventStartA(0);EventStopA(0);

圖 9
6. 編譯下載
按 F7 進行編譯,可以看到沒有任何錯誤。下載到目標板上。

圖 10
五、討論分析
1. 修改函數內的時間,查看分析結果。
EventStopA(0);

圖 13
2. 多個函數進行測量時間。
EventStartB(0);
osThreadFlagsSet (tid_thrLED, 1U); // Set flag to thrLED
EventStopB(0);

圖 14
六、結論
1. 通過EventRecorder,我們能夠精準地測量函數的執行時間,從而為性能分析提供堅實的數據支持。
2. EventRecorder不僅限于單一函數的時間測量,它同樣擅長同時監控多個函數的執行時長,使得復雜的應用場景下的性能評估變得游刃有余。
3. 更令人稱道的是,這項技術并不依賴于繁瑣的跟蹤機制;僅需借助STLINK仿真器即可輕松實現,極大地簡化了開發流程中的調試步驟。
4. 以極其精簡的內存開銷作為代價,EventRecorder卻能為我們帶來詳盡而深入的應用程序執行時間分析報告,堪稱是軟件優化過程中不可或缺的利器。
如有任何問題或建議,請聯系相關負責人或技術支持團隊。

首頁 > 資源中心 > FAQ
