這是 CM Kormanyos,即時 C++:高效物件導向和模板微控制器編程,第四版(施普林格,海德堡,2021 年)ISBN 9783662629956 書的配套代碼。
該存儲庫有幾個主要部分。
ref_app
位於 ref_app。這也包括基準。GNU/GCC 交叉編譯器和在Win*
上運行的各種附加工具(如下所述某些建置可選需要)可以在相關的 ckormanyos/real-time-cpp-toolchains 儲存庫中找到。
參考應用程式使用小型啟動程式碼啟動,隨後初始化瘦微控制器抽象層 (MCAL)。然後控制權被傳遞到一個簡單的多任務調度程序,該調度程序管理 LED 應用程式、調用循環基準測試任務並為看門狗提供服務。
LED 應用程式以以下頻率切換使用者 LED
參考應用程式與 C++14、17、20、23 及更高版本相容。
應用軟體只需實現一次,並在 ref_app 中的每個支援的目標上統一使用。各個目標之間的差異僅出現在與晶片特定和板特定啟動/MCAL 細節相關的較低軟體層中。
透過這種方式,該計畫展現出高水準的可移植性。
參考應用程式支援以下目標:
目標名稱(在建置命令中使用) | 目標描述 | *(麵包板) |
---|---|---|
avr | MICROCHIP(R) [前 ATMEL(R)] AVR(R) ATmega328P | X |
atmega2560 | MICROCHIP(R) [前 ATMEL(R)] AVR(R) ATmega2560 | |
atmega4809 | MICROCHIP(R) [前 ATMEL(R)] AVR(R) ATmegax4809 | X |
am335x | BeagleBone 與 Texas Instruments(R) AM335x ARM(R) A8 | |
bcm2835_raspi_b | 帶有 ARM1176-JZFS(TM) 的 RaspberryPi(R) 零 | |
Debug / Release | Win* 上的 PC 透過 MSVC x64 編譯器Debug / Release | |
host | Win* / mingw64 / *nix 上的 PC/工作站(透過主機編譯器) | |
lpc11c24 | NXP(R) OM13093 LPC11C24 板 ARM(R) Cortex(R)-M0+ | |
nxp_imxrt1062 | Teensy 4.0 板 / NXP(R) iMXRT1062 ARM(R) Cortex(R)-M7 | X |
riscvfe310 | SiFive RISC-V FE310 SoC | |
rl78 | 瑞薩(R) RL78/G13 | |
rpi_pico_rp2040 | 具有雙 ARM(R) Cortex(R)-M0+ 的 RaspberryPi(R) Pico RP2040 | X |
rpi_pico2_rp2350 | 具有雙 ARM(R) Cortex(R)-M33 的 RaspberryPi(R) Pico2 RP2350 | X |
rx63n | 瑞薩(R) RX630/RX631 | |
stm32f100 | 意法半導體(R) STM32F100 ARM(R) Cortex(R)-M3 | X |
stm32f407 | 意法半導體(R) STM32F407 ARM(R) Cortex(R)-M4F | |
stm32f429 | 意法半導體(R) STM32F429 ARM(R) Cortex(R)-M4F | |
stm32f446 | 意法半導體(R) STM32F446 ARM(R) Cortex(R)-M4F | |
stm32h7a3 | 意法半導體(R) STM32H7A3 ARM(R) Cortex(R)-M7 | |
stm32l100c | 意法半導體(R) STM32L100 ARM(R) Cortex(R)-M3 | X |
stm32l152 | 意法半導體(R) STM32L152 ARM(R) Cortex(R)-M3 | |
stm32l432 | 意法半導體(R) STM32L432 ARM(R) Cortex(R)-M4F | X |
v850es_fx2 | 瑞薩電子 V850es/Fx2 upd703231 | |
wch_ch32v307 | WCH CH32v307 RISC-V板 | |
wch_ch32v307_llvm | WCH CH32v307 RISC-V 板(但使用 LLVM 工具鏈) | |
x86_64-w64-mingw32 | 透過 GNU/GCC x86_x64 編譯器執行Win* / mingw64 的 PC | |
xtensa32 | 樂鑫 (XTENSA) NodeMCU ESP32 | X |
在此表中,*(麵包板)表示該板(或其某些版本)可以輕鬆地與普通麵包板一起使用。這可能需要一些非常簡單的手動焊接/安裝插頭引腳。
使用受支援的板之一開始參考應用程式是最簡單的,例如avr
(ARDUINO) 或bcm2835_raspi_b
(RaspberryPi ZERO) 或am335x
(BeagleBoneBlack) 等。
參考應用程式使用交叉開發,並且建置系統受以下支援:
*nix
make 工具與 LINUX/MacOS 上的 Bash/GNUmake(bash 腳本)結合使用,Win*
上移植了*nix
式的 make 工具,Win*
,成功完成建置後,產生的工件包括 HEX 檔案(例如ref_app.hex
)、映射檔案、大小報表等,可在bin
目錄中找到。
開始使用*nix
上的參考應用程式
target avr
)。build.sh
: ./target/build/build.sh avr rebuild
。avr rebuild
呼叫 GNU make,隨後為target avr
重建整個解決方案。*nix
上取得它們,請執行sudo apt install gcc-avr avr-libc
。*nix
上為target avr
的範例我們現在將舉例說明如何在*nix
中的命令 shell 上為target avr
建立參考應用程式。該目標系統基本上包括任何ARDUINO(R) 相容板。這也是書中自製板實際使用的板相容性。
如果需要,安裝gcc-avr
。
sudo apt install gcc-avr avr-libc
克隆或取得 ckormanyos/real-time-cpp 儲存庫。然後建構:
cd real-time-cpp
cd ref_app
./target/build/build.sh avr rebuild
target stm32f446
在*nix
上建構的範例現在,我們將舉例說明如何在*nix
中的命令 shell 上為 ARM(R) 目標建立參考應用程式。例如,考慮建構變體target stm32f446
。 STMicroElectronics(R) 的 NUCLEO-F446RE 板可以方便地用於此目的。
如有需要,安裝gcc-arm-none-eabi
。
sudo apt install gcc-arm-none-eabi
克隆或取得 ckormanyos/real-time-cpp 儲存庫。然後建構:
cd real-time-cpp
cd ref_app
./target/build/build.sh stm32f446 rebuild
target stm32f446
建置的範例現在,我們將舉例說明如何在 MacOS 的命令 shell 中為 ARM(R) 目標建立參考應用程式。例如,考慮建構變體target stm32f446
。 STMicroElectronics(R) 的 NUCLEO-F446RE 板可以方便地用於此目的。
克隆或取得 ckormanyos/real-time-cpp 儲存庫。
MacOS 上的 GNUmake 預設版本 3.81(現在)可以使用。此儲存庫中使用的 make 檔案已與其相容。有關背景信息,另請參閱第 273 期。
透過直接手動呼叫make
來建立目標。
cd real-time-cpp
cd ref_app
make -f target/app/make/app_make.gmk rebuild TGT=stm32f446
如果需要工具鏈,則必須在建立參考應用程式的目標之前安裝或檢索它。
如果需要,您可以透過wget
取得(或選擇安裝) gcc-arm-none-eabi
工具鏈。在這種情況下,我發現使用適用於 MacOS 的現代gcc-arm-none-eabi
很方便,可以在 Arm GNU Toolchain Downloads 中找到它。
可以透過wget
取得arm-non-eabi
工具鏈並在 shell 本地成功使用。如果需要,請按照以下逐步程序進行操作。
步驟1:建立一個本機目錄(例如macos-gnu-arm-toolchain
)並cd
進入該目錄。
cd real-time-cpp
mkdir -p macos-gnu-arm-toolchain
cd macos-gnu-arm-toolchain
步驟 2:使用wget
取得工具鏈的 tarball,解壓縮並將編譯器的bin
目錄加入 shell 的可執行路徑中。
wget --no-check-certificate https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi.tar.xz
tar -xvf arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi.tar.xz
PATH= $( pwd ) /arm-gnu-toolchain-12.2.rel1-darwin-x86_64-arm-none-eabi/bin: $PATH
步驟 3:可選擇echo
PATH
以進行快速路徑檢查。查詢arm-non-eabi-g++
的版本也很有幫助。這有望驗證工具鏈是否已正確添加到此 shell 的本地PATH
中。
echo $PATH
arm-none-eabi-g++ -v
現在只需使用命令透過直接呼叫make
來建立目標(與上面*nix
情況所示的相同)。
cd real-time-cpp
cd ref_app
make -f target/app/make/app_make.gmk rebuild TGT=stm32f446
開始使用Win*
上的參考應用程式
Win*
上執行的任何所需的 GNU/GCC 交叉編譯器,如下面幾段詳細所述。ref_app.sln
。 Microsoft(R) VisualStudio(R) 中的ref_app
大量使用使用外部Makefile類型的專案工作區的交叉開發。 GNUmake 在建置過程中透過批次檔呼叫。隨後它與幾個 Makefile 結合運行。
要為 Win32 建立除Debug
或Release
之外的任何ref_app
目標,需要交叉編譯器(GNU/GCC 交叉編譯器)。有關更多詳細信息,請參閱下面的文字。
在Win*
上運行的 GNU/GCC 交叉編譯器旨在用於 VisualStudio(R) 上的參考應用程序,可以在工具鏈存儲庫 ckormanyos/real-time-cpp-toolchains 中找到。工具鏈儲存庫包含有關安裝、移動和使用這些移植的 GNU/GCC 編譯器的詳細說明。
有關Win*
的 GNUmake 的注意事項:可以在 ckormanyos/make-4.2.1-msvc-build 儲存庫中找到能夠在Win*
上使用的 GNUmake。如果需要,請克隆或取得此儲存庫的程式碼。使用 MSVC(即 VC 14.2 或更高版本,社群版即可)在其x64
Release
配置中建置make-4.2.1
。
跨環境CMake可以建立參考應用程式。為此,也為每個受支援的目標建立了 CMake 檔案。
例如,考慮使用 CMake 為avr
目標建立參考應用程式。其模式如下所示。
cd real-time-cpp
mkdir build
cd build
cmake ../ref_app -DTRIPLE=avr -DTARGET=avr -DCMAKE_TOOLCHAIN_FILE=../ref_app/cmake/gcc-toolchain.cmake
make -j ref_app
例如,我們現在將考慮使用 CMake 為受支援的 ARM(R) 目標之一建立參考應用程式。其模式如下所示。在這種情況下,我們需要確定以下 make 選項:
-DTRIPLE=avr -DTARGET=avr
將這些選項切換為正在建置的基於stm32f446
ARM(R) 的目標的選項。
-DTRIPLE=arm-none-eabi -DTARGET=stm32f446
讓我們完整地闡明指令,以便執行stm32f446
(即採用 Cortex(R)-M4F 的 ST Micro electronics(R) STM32F446 ARM(R))的 CMake 建置。
cd real-time-cpp
mkdir build
cd build
cmake ../ref_app -DTRIPLE=arm-none-eabi -DTARGET=stm32f446 -DCMAKE_TOOLCHAIN_FILE=../ref_app/cmake/gcc-toolchain.cmake
make -j ref_app
使用 CMake 建置其他目標時,請遵循標準*nix
模式進行建置。也可以使用 CMake 建置x86_64-w64-mingw32
或來自 MSYS、Cygwin 或任何類似*nix
的 shell 或控制台的host
也應該可以工作。
以下命令序列將在類似*nix
的 shell 或控制台上為本機host
建置。
cd real-time-cpp
mkdir build
cd build
cmake ../ref_app -DTARGET=host -DCMAKE_TOOLCHAIN_FILE=../ref_app/cmake/gcc-toolchain.cmake
make -j ref_app
還有一個適用於 ATMEL(R ref_app.atsln
AtmelStudio(R) 7 的工作區解決方案。參考應用程式以及每個範例都有 ATMEL Studio 專案。此儲存庫中的 ATMEL Studio 專案僅支援 AVR 目標。
如果您決定使用 ATMEL Studio,則不需要為這些項目使用或包含任何其他程式庫(除了在 ATMEL Studio 標準安裝期間通常安裝的程式庫)。
包括啟動程式碼和連結器定義檔在內的目標詳細資訊可以在 ref_app/target 目錄及其子目錄中找到。每個受支援的目標微控制器系統都有單獨的子目錄。
稱為target avr
MICROCHIP(R) [前 ATMEL(R)] AVR(R) 配置在經典的 ARDUINO(R) 相容板上運行。程式會切換portb.5
上的黃色 LED。
MICROCHIP(R) [前 ATMEL(R)] ATmega4809 配置稱為target atmega4809
在 ARDUINO(R) EVERY 相容板上運行,內部諧振器時脈頻率為porte.2
上的黃色 LED(即D5
)。
Espressif (XTENSA) NodeMCU ESP32 實作使用 Espressif SDK 的子集來執行參考應用程序,並僅在其 1 個核心上執行單一作業系統任務。
NXP(R) OM13093 LPC11C24 板 ARM(R) Cortex(R)-M0+ 配置稱為“目標 lpc11c24”,可切換port0.8
上的 LED。
ARM(R) Cortex(R)-M3 配置(稱為target stm32f100
)在 ST Micro electronics(R) 出售的 STM32VL-DISCOVERY 板上運行。此程式切換portc.8
上的藍色 LED。
第二個 ARM(R) Cortex(R)-M3 配置(稱為target stm32l100c
)在 ST Micro electronics(R) 出售的 STM32L100-DISCOVERY 板上運行。此程式切換portc.8
上的藍色 LED。
第三個 ARM(R) Cortex(R)-M3 配置(稱為target stm32l152
)在 ST Micro electronics(R) 出售的 STM32L152C-DISCOVERY 板上運行。此程式切換portb.6
上的藍色 LED。
第一個 ARM(R) Cortex(R)-M4F 配置(稱為target stm32f407
)在 ST Micro electronics(R) 出售的 STM32F4-DISCOVERY 板上運行。程式會切換portd.15
上的藍色 LED。
另一種 ARM(R) Cortex(R)-M4F 配置(稱為target stm32f446
)在 ST Micro electronics(R) 出售的 STM32F446-NUCLEO-64 板上運行。程式會切換porta.5
上的綠色 LED。為有興趣的人提供了該系統的臭氧調試文件。
第一個 ARM(R) Cortex(R)-M7 配置(稱為target stm32h7a3
)在 ST Micro electronics(R) 出售的 STM32H7A3-NUCLEO-144 板上運行。程式會切換portb.0
上的綠色 LED。
ARM(R) A8 配置(稱為target am335x
)在 BeagleBone 板(黑色版)上運作。對於白色版本,CPU 時鐘需要從*nix
發行版運行。我們的程式旨在從儲存在 FAT32 SDHC 微卡上的名為MLO的原始二進位檔案啟動 BeagleBone。此二進位檔案包括一個由兩個 32 位元整數組成的特殊引導標頭。程式從 SD 卡載入到 RAM 記憶體並隨後執行。開啟 BeagleBone black 時,必須在給板通電時按下啟動按鈕 (S2)。此程式切換第一個使用者 LED( port1.21
上的 LED1)。
ARM(R) 1176-JZF-S 配置(稱為target bcm2835_raspi_b
)在 RaspberryPi(R) Zero (PiZero) 單核心控制器上執行。該專案為 PiZero 創建了一個裸機程式。程式獨立於板上任何類型的*nix
發行版運行。我們的程式旨在從原始二進位啟動 PiZero。原始二進位檔案稱為kernel.img ,它儲存在 FAT32 SDHC 微卡上。程式objcopy可用於使用輸出標誌-O binary
從 ELF 檔案中提取原始二進位。 kernel.img 檔案與其他三個檔案一起儲存在 SD 卡上:bootcode.bin、start.elf 和(可選)config.txt,所有這些都在網路上進行了描述。此儲存庫中包含運行裸機參考應用程式的 SD 卡的完整 PiZero 啟動內容集。此程式在 GPIO 索引0x47
處切換 GPIO 狀態 LED。
rpi_pico_rp2040
目標配置採用雙核心 ARM(R) Cortex(R)-M0+ 的 RaspberryPi(R) Pico RP2040,時脈頻率為Blinky_Pico_dual_core_nosdk
儲存庫,並取自(非常感謝)。
rpi_pico2_rp2350
目標配置採用雙核心 ARM(R) Cortex(R)-M33 的 RaspberryPi(R) Pico2 RP2350,時脈頻率為2040
基本相同。同樣,雙核心啟動是由現代化的Blinky_Pico2_dual_core_nosdk
儲存庫中揭示的努力開創的。
目標v850es_fx2
使用經典的 Renesas(R) V850es/Fx2 核心。使用 F-Line Drive It入門套件上的 upd703231 微控制器衍生產品。
riscvfe310
目標在 Spark Fun 的商用Red Thing Plus板上使用 SiFive RISC-V FE310 SoC。連接埠GPIO0.5
上的藍色 LED 已切換。
wch_ch32v307
的適配在 WCH CH32v307 板上運作。它GPIOC.0
南京勤恆微電子有限公司的RISC-V CH32v307微控制器。類似的適配wch_ch32v307_llvm
本質上是相同的,只是它使用 LLVM RISC-V 工具鏈而不是 GCC RISC-V。
目標nxp_imxrt1062
在 Spark Fun 的 Teensy 4.0 板上運行。橘色使用者 LED 已切換。
對於其他相容板,請隨時直接與我聯繫或提交問題,請求為您所需的目標系統提供支援。
基準測試提供了可擴展、便攜的方法來識別微控制器的性能和性能等級。有關更多信息,請參閱基準測試頁面上的詳細信息。
此儲存庫中的項目使用自行編寫的啟動程式碼,以裸機、裸機模式進行無作業系統程式設計。除了本機 C++ 及其自己的標準函式庫之外,不使用任何外部函式庫。
例如,考慮 BeagleBone Black Edition(BBB,也稱為target am335x
),它是此儲存庫中支援的幾種流行目標系統之一。此板上的項目從 SD 卡上的二進位映像檔MLO啟動。與此儲存庫中的所有其他項目一樣,BBB 專案執行自己的靜態初始化和晶片初始化(即,在本例中為 ARM(R) 8 AM335x 處理器的晶片初始化)。 BBB 專案在初始化之後,隨後跳到main()
它初始化am335x
MCAL 並啟動我們自己編寫的多任務調度程式。
下圖描繪了運作中的裸機 BeagleBone Black Edition。在這種裸機運作模式下,BBB上沒有運作*nix
作業系統,沒有鍵盤、沒有滑鼠、沒有顯示器、沒有偵錯介面、沒有模擬器。
板上的微控制器正在循環執行上述基準測試之一。在多任務操作中,第一個使用者 LED 在port1.21
上切換,示波器在數位 I/O port1.15
(BBB 的接頭引腳P8.15
上擷取基準時間訊號的即時測量結果。
建置狀態徽章代表夜間 CI 建置和測試的狀態。
avr-gcc
工具鏈倉庫 ckormanyos/avr-gcc-build 為x86_64-linux-gnu
和x86_64-w64-mingw32
最新的avr-gcc
工具鏈。 Shell 和 YAML 腳本直接從 GHA 運行器上的原始程式碼建置avr-gcc
。此外,偶爾的 GitHub 版本也為x86_64-linux-gnu
和x86_64-w64-mingw32
提供預先建置的avr-gcc
工具鏈。
這個儲存庫是學習如何從原始碼建立自己的avr-gcc
工具鏈的好地方。簡單明了、描述良好的 shell 和 YAML 腳本易於理解、使用或改編。
如上所述,ckormanyos/real-time-cpp-toolchains 中描述了更詳細、更廣泛的嵌入式工具鏈。其中包括前面提到的avr-gcc
工具鏈以及其他工具鏈(有些在其他地方很難找到)。
參考應用程式和範例(以及程式碼片段)可以使用 GNU/GCC 編譯器和 GNUmake 在*nix
上建置。假定*nix
上的 GNU/GCC 交叉編譯器和 GNUmake 在標準可執行路徑中可用,例如在標準 get-install 實作之後。
工具鏈儲存庫 realtime-cpp-toolchains 中提供了一些針對Win*
移植 GNU/GCC 交叉編譯器。在 Microsoft(R) VisualStudio(R) 中進行開發/建置時,這些可以與參考應用程式中的微控制器解決方案配置一起使用。各種其他 GNU 工具(例如 GNUmake、SED 等)已被移植並可以在那裡找到。當在Win*
上建立交叉嵌入式專案(例如ref_app
時,這些在 Makefile 中使用。
在Win*
上的參考應用程式中,Makefile 對各個工具和 GNU/GCC 工具鏈使用自訂的預設位置。 Win*
上的工具鏈預設位置是./ref_app/tools/Util/msys64/usr/local
。這個特定的工具鏈位置受到msys2
/ mingw64
系統的啟發。
用於在Win*
上跨 MSVC/GCC 建構的工具鏈應位於此處。這些工具鏈不是此儲存庫的一部分,當使用受支援的Win*
版本時,或選擇將 VisualStudio(R) 專案與 CMD Batch 一起使用時,有必要單獨取得這些工具鏈。
有關取得和使用Win*
上跨 MSVC/GCC 建立的工具鏈的詳細說明,請參閱 realtime-cpp-toolchains 儲存庫。這些說明提供了在選擇 Microsoft(R) VisualStudio(R) 專案(透過通常的上述 MSVC/ Win*
方式)建立參考應用程式時使用這些工具鏈的指導。
建置參考需要具有高水平 C++14(或更高)意識和遵守的 GNU/GCC 連接埠(或其他編譯器),例如 GCC 5 到 13(通常越高越好)或 MSVC 14.2 或更高版本應用程式(以及範例和程式碼片段)。
有些程式碼片段不僅示範了 C++14 中的語言元素,也示範了 C++17、20、23 及更高版本的語言元素。因此,支援 C++17 甚至 C++20、23(例如 GCC 13、clang 15、MSVC 14.3 或更高版本)的編譯器可能有利於所有程式碼片段的成功。
<chrono>
、 <ratio>
和一些內部特徵標頭)已獲得 GNU 通用公共授權版本 3 或更高版本的授權。