CubeIDE Note 08: Lesson 4+. Using CCMRAM & Optimizer to Obtain Better Performance
教學
如何使用 CCMRAM 與優化器獲得更好的執行效能
環境
本文使用
OS: Windows x64
STM32CubeIDE Version: 1.6.1
開發板: NUCLEO-F334R8(STM32F334R8)
Low-Layer (LL) Library
教學文章列表
參考資料
UM2570. Description of STM32G4 HAL and low-layer drivers
RM0364. STM32F334xx advanced Arm®-based 32-bit MCUs
Datasheet. STM32F334x4 STM32F334x6 STM32F334x8
Section 1. 1 前情提要
在 Lesson 4. ADC 設定與應用中基本題要求同學測量ADC之轉換時間,
大部分同學應該都無法測量到與理論值相近的數據
轉換時間 = 採樣時間 + 12.5 clock cycles
根據基本題,Sampling Time 是 1.5 cycle
ADC clock = 72 MHz,所以 T_cycle = 1 / 72M = 14 (ns / cycle)Cycle_conv = 1.5 + 12.5 = 14 (cycle)
T_conv = 14 cycle * 14 ns / cycle = 196 ns轉換時間大約會在196 ns 左右
答案揭曉
這是由於DSP程式執行速度不夠,這個不夠不是指硬體上的不夠,
而是程式碼方面在執行上,沒有採用最有效率的做法。
解決方案
i. 直接操作暫存器,減少處理器調用函數
ii. 使用編譯器自帶的優化器,進行速度優化
iii. 使用CCMRAM(SRAM區塊),減少調用延遲
Section 1. 2 各方案比較
A. 原始速度
我們先來看原本的程式碼,是調用 Low-Layer(LL) 函數庫
執行結果
可看到 ADC 轉換時間大概是 980 ns
B. 直接操作暫存器
不使用 LL 函數庫語法,直接操作暫存器
執行結果
可看到ADC轉換時間大概是 350ns,速度已經快了至少一倍
C. 加入程式編譯優化
參考資料
https://community.st.com/s/question/0D53W000003LIl7SAG/how-do-i-change-code-optimization
Step 1.
我們在 Project Explorer 對目前專案點右鍵,選擇最後一項 Properties
Step 2.
展開 C/C++ Build,選擇 Settings,展開MCU GCC Compiler
選擇 Optimization
Step 3.
Optimization Level 設定為 Optimize for speed (-Ofast)
設定好按 Apply and Close,重新編譯即可測試
執行結果
可看到ADC轉換時間大概是 240ns,速度又提升了不少
這個方式可再進一步提升速度,可是 Live Expression會無法即時監看變數
D. 將要調用的函數變數寫入CCMRAM中
參考資料
AN4296. Use STM32F3/STM32G4 CCM SRAM
https://www.st.com/resource/en/application_note/dm00083249-use-stm32f3stm32g4-ccm-sram-with-iar-embedded-workbench-keil-mdkarm-stmicroelectronics-stm32cubeide-and-other-gnubased-toolchains-stmicroelectronics.pdfSTM32cubeIDE使用 CCMRAM - CSDN
https://blog.csdn.net/chejianhp/article/details/104089952STM32CubeMX简单使用笔记:CCM的简单使用和简单分析 https://cstriker1407.info/blog/stm32cubemx-note-ccm-use/
Flash — 成大資工 wiki
http://wiki.csie.ncku.edu.tw/embedded/FlashUsing CCM Memory — OpenSTM32 Comunity
https://www.openstm32.org/Using+CCM+Memory?structure=Documentation
Step 1. 增加 CCMRAM 分區
打開 STM32F334R8TX.ld 檔案
STM32F3348-DISCO (綠板/藍板): STM32F334C8TX
F334-NUCLEO(白板): STM32F334R8TX
在最後一個大括號前加入以下程式
Step 2. 增加啟動時 CCMRAM 分區搬移
打開 startup_stm32f334r8tx.s
找到movs那開始取代成下面程式碼
FillZerobss: 有重覆到記得要刪除
Step 3. Marco 指定 Section
終於可以來使用CCMRAM了,打開 stm32f3xx_it.c
並在要放進CCMRAM的函數或變數前加上 CCMRAM,如下
執行結果
可看到ADC轉換時間大概是 196ns,與理論結果一致
到此大概就完整逼出MCU性能了