Dies ist der Begleitcode für das Buch CM Kormanyos, Real-Time C++: Efficient Object-Oriented and Template Microcontroller Programming, Fourth Edition (Springer, Heidelberg, 2021) ISBN 9783662629956.
Dieses Repository besteht aus mehreren Hauptteilen.
ref_app
in ref_app. Hierzu zählen auch die Benchmarks. GNU/GCC-Cross-Compiler und verschiedene zusätzliche Tools, die unter Win*
laufen und optional für bestimmte Builds benötigt werden, wie unten beschrieben, finden Sie im zugehörigen ckormanyos/real-time-cpp-toolchains-Repository.
Die Referenzanwendung startet mit einem kleinen Startcode und initialisiert anschließend eine dünne Mikrocontroller-Abstraktionsschicht (MCAL). Die Steuerung wird dann an einen einfachen Multitasking-Scheduler übergeben, der die LED-Anwendung verwaltet, eine zyklische Benchmark-Aufgabe aufruft und den Watchdog bedient.
Die LED-Anwendung schaltet eine Benutzer-LED mit einer Frequenz von
Die Referenzanwendung ist mit C++ 14, 17, 20, 23 und höher kompatibel.
Die Anwendungssoftware wird einmal implementiert und einheitlich auf jedem unterstützten Ziel in der ref_app verwendet. Unterschiede zwischen den einzelnen Zielen ergeben sich lediglich in den unteren Softwareschichten hinsichtlich Chip-spezifischer und Board-spezifischer Startup-/MCAL-Details.
Dadurch weist das Projekt ein hohes Maß an Portabilität auf.
Die Referenzanwendung unterstützt die folgenden Ziele:
Zielname (wie im Build-Befehl verwendet) | Zielbeschreibung | *(Steckbrett) |
---|---|---|
avr | MICROCHIP(R) [ehemals ATMEL(R)] AVR(R) ATmega328P | X |
atmega2560 | MICROCHIP(R) [ehemals ATMEL(R)] AVR(R) ATmega2560 | |
atmega4809 | MICROCHIP(R) [ehemals ATMEL(R)] AVR(R) ATmegax4809 | X |
am335x | BeagleBone mit Texas Instruments(R) AM335x ARM(R) A8 | |
bcm2835_raspi_b | RaspberryPi(R) Zero mit ARM1176-JZFS(TM) | |
Debug / Release | PC unter Win* über MSVC x64-Compiler Debug / Release | |
host | PC/Workstation unter Win* / mingw64 / *nix über Host-Compiler | |
lpc11c24 | NXP(R) OM13093 LPC11C24 Platine ARM(R) Cortex(R)-M0+ | |
nxp_imxrt1062 | Teensy 4.0-Board / NXP(R) iMXRT1062 ARM(R) Cortex(R)-M7 | X |
riscvfe310 | SiFive RISC-V FE310 SoC | |
rl78 | Renesas(R) RL78/G13 | |
rpi_pico_rp2040 | RaspberryPi(R) Pico RP2040 mit dualem ARM(R) Cortex(R)-M0+ | X |
rpi_pico2_rp2350 | RaspberryPi(R) Pico2 RP2350 mit dualem ARM(R) Cortex(R)-M33 | X |
rx63n | Renesas(R) RX630/RX631 | |
stm32f100 | STMicroelectronics(R) STM32F100 ARM(R) Cortex(R)-M3 | X |
stm32f407 | STMicroelectronics(R) STM32F407 ARM(R) Cortex(R)-M4F | |
stm32f429 | STMicroelectronics(R) STM32F429 ARM(R) Cortex(R)-M4F | |
stm32f446 | STMicroelectronics(R) STM32F446 ARM(R) Cortex(R)-M4F | |
stm32h7a3 | STMicroelectronics(R) STM32H7A3 ARM(R) Cortex(R)-M7 | |
stm32l100c | STMicroelectronics(R) STM32L100 ARM(R) Cortex(R)-M3 | X |
stm32l152 | STMicroelectronics(R) STM32L152 ARM(R) Cortex(R)-M3 | |
stm32l432 | STMicroelectronics(R) STM32L432 ARM(R) Cortex(R)-M4F | X |
v850es_fx2 | Renesas(R) Electronics V850es/Fx2 upd703231 | |
wch_ch32v307 | WCH CH32v307 RISC-V-Board | |
wch_ch32v307_llvm | WCH CH32v307 RISC-V-Board (jedoch mit einer LLVM-Toolchain) | |
x86_64-w64-mingw32 | PC unter Win* / mingw64 über den GNU/GCC x86_x64-Compiler | |
xtensa32 | Espressif (XTENSA) NodeMCU ESP32 | X |
In dieser Tabelle bedeutet *(Steckbrett), dass die Platine (oder bestimmte Versionen davon) problemlos mit einem herkömmlichen Steckbrett verwendet werden kann. Dies erfordert möglicherweise ein sehr einfaches manuelles Löten/Montieren der Stiftleisten.
Der Einstieg in die Referenzanwendung erfolgt am einfachsten über eines der unterstützten Boards, wie z. B. avr
(ARDUINO) oder bcm2835_raspi_b
(RaspberryPi ZERO) oder am335x
(BeagleBoneBlack) usw. Die Referenzanwendung befindet sich im Verzeichnis ref_app und seinen Unterverzeichnissen .
Die Referenzanwendung verwendet entwicklungsübergreifende und Build-Systeme, die unterstützt werden auf:
*nix
Make-Tools in Kombination mit Bash/GNUmake (Bash-Skript) unter LINUX/MacOS,*nix
-ähnliche Make-Tools auf Win*
in Kombination mit Batch-Skript oder Microsoft(R) Visual Studio(R) über External Makefile ,Win*
, Nach erfolgreichem Abschluss des Builds sind die resultierenden Artefakte, einschließlich HEX-Dateien (z. B. ref_app.hex
), Kartendateien, Größenberichte usw., im bin
Verzeichnis verfügbar.
Um mit der Referenzanwendung auf *nix
zu beginnen
target avr
) Sie erstellen möchten.build.sh
mit dem Befehl aus: ./target/build/build.sh avr rebuild
.avr rebuild
auf, wodurch anschließend die gesamte Lösung für target avr
neu erstellt wird.*nix
installieren müssen, führen Sie sudo apt install gcc-avr avr-libc
aus.*nix
für target avr
Wir werden nun veranschaulichen, wie die Referenzanwendung auf einer Befehlsshell in *nix
für target avr
erstellt wird. Dieses Zielsystem umfasst im Wesentlichen jedes ARDUINO(R)-kompatible Board. Dies ist auch die tatsächlich verwendete Board-Kompatibilität mit den selbstgebauten Boards im Buch.
Installieren Sie bei Bedarf gcc-avr
.
sudo apt install gcc-avr avr-libc
Klonen Sie das ckormanyos/real-time-cpp-Repository oder laden Sie es herunter. Dann bauen Sie mit:
cd real-time-cpp
cd ref_app
./target/build/build.sh avr rebuild
*nix
für target stm32f446
Wir werden nun veranschaulichen, wie die Referenzanwendung auf einer Befehlsshell in *nix
für ein ARM(R)-Ziel erstellt wird. Betrachten Sie zum Beispiel die Build-Variante target stm32f446
. Hierfür kann bequem das NUCLEO-F446RE-Board von STMicroelectronics(R) verwendet werden.
Installieren Sie bei Bedarf gcc-arm-none-eabi
.
sudo apt install gcc-arm-none-eabi
Klonen Sie das ckormanyos/real-time-cpp-Repository oder laden Sie es herunter. Dann bauen Sie mit:
cd real-time-cpp
cd ref_app
./target/build/build.sh stm32f446 rebuild
target stm32f446
Wir werden nun veranschaulichen, wie die Referenzanwendung in einer Befehlsshell in MacOS für ein ARM(R)-Ziel erstellt wird. Betrachten Sie zum Beispiel die Build-Variante target stm32f446
. Hierfür kann bequem das NUCLEO-F446RE-Board von STMicroelectronics(R) verwendet werden.
Klonen Sie das ckormanyos/real-time-cpp-Repository oder laden Sie es herunter.
Die Standardversion 3.81 von GNUmake unter MacOS kann (jetzt) verwendet werden. Die in diesem Repository verwendeten Make-Dateien wurden damit kompatibel gemacht. Hintergrundinformationen finden Sie auch in Ausgabe 273.
make
Sie das Ziel mit einem direkten manuellen Aufruf.
cd real-time-cpp
cd ref_app
make -f target/app/make/app_make.gmk rebuild TGT=stm32f446
Wenn die Toolchain benötigt wird, muss sie installiert oder abgerufen werden, bevor das Ziel der Referenzanwendung erstellt wird.
Bei Bedarf können Sie die gcc-arm-none-eabi
Toolchain über wget
herunterladen (oder optional installieren). In diesem Fall fand ich es praktisch, ein modernes gcc-arm-none-eabi
für MacOS zu verwenden, das unter Arm GNU Toolchain Downloads zu finden ist.
Die arm-non-eabi
-Toolchain kann über wget
abgerufen und erfolgreich lokal in der Shell verwendet werden. Wenn Sie dies wünschen, befolgen Sie die nachstehende Schritt-für-Schritt-Anleitung.
Schritt 1: Erstellen Sie ein lokales Verzeichnis (z. B. macos-gnu-arm-toolchain
) und cd
es.
cd real-time-cpp
mkdir -p macos-gnu-arm-toolchain
cd macos-gnu-arm-toolchain
Schritt 2: Rufen Sie den Tarball der Toolchain mit wget
ab, entpacken Sie ihn und fügen Sie das bin
-Verzeichnis des Compilers zum ausführbaren Pfad der Shell hinzu.
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
Schritt 3: echo
optional den PATH
für eine schnelle Pfadprüfung wieder. Es kann auch hilfreich sein, die Version von arm-non-eabi-g++
abzufragen. Dadurch soll überprüft werden, ob die Toolchain korrekt zum lokalen PATH
dieser Shell hinzugefügt wurde.
echo $PATH
arm-none-eabi-g++ -v
Verwenden Sie nun einfach die Befehle, um das Ziel mit einem direkten Aufruf von make
zu erstellen (derselbe wie oben für den *nix
-Fall gezeigt).
cd real-time-cpp
cd ref_app
make -f target/app/make/app_make.gmk rebuild TGT=stm32f446
So starten Sie mit der Referenzanwendung unter Win*
Win*
laufen, und richten Sie sie ein (aus dem ckormanyos/real-time-cpp-toolchains-Repository), wie in den folgenden Absätzen ausführlich beschrieben.ref_app.sln
im Verzeichnis ref_app. Der ref_app
Build in Microsoft(R) VisualStudio(R) nutzt intensiv die Cross-Entwicklung unter Verwendung eines Projektarbeitsbereichs vom Typ External Makefile . GNUmake wird im Build-Prozess über eine Batch-Datei aufgerufen. Anschließend läuft es in Kombination mit mehreren Makefiles.
Um ein anderes ref_app
Ziel als Debug
oder Release
für Win32 zu erstellen, ist ein Cross-Compiler (GNU/GCC-Cross-Compiler) erforderlich. Weitere Einzelheiten finden Sie im folgenden Text.
GNU/GCC-Cross-Compiler, die unter Win*
laufen und für die Referenzanwendung auf VisualStudio(R) gedacht sind, finden Sie im Toolchains- Repository ckormanyos/real-time-cpp-toolchains. Das Toolchains -Repository enthält detaillierte Anweisungen zum Installieren, Verschieben und Verwenden dieser portierten GNU/GCC-Compiler.
Hinweis zu GNUmake für Win*
: Ein GNUmake, das unter Win*
verwendet werden kann, finden Sie im Repository ckormanyos/make-4.2.1-msvc-build. Klonen Sie bei Bedarf den Code dieses Repositorys oder rufen Sie ihn ab. Erstellen Sie make-4.2.1
in seiner x64
Release
-Konfiguration mit MSVC (dh VC 14.2 oder höher, Community Edition ist in Ordnung).
Cross-Environment CMake kann die Referenzanwendung erstellen. Zu diesem Zweck wurden auch CMake-Dateien für jedes unterstützte Ziel erstellt.
Erwägen Sie beispielsweise die Erstellung der Referenzanwendung für das avr
Ziel mit CMake. Das Muster ist unten dargestellt.
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
Wir betrachten nun beispielsweise die Erstellung der Referenzanwendung für eines der unterstützten ARM(R)-Ziele mit CMake. Das Muster ist unten dargestellt. In diesem Fall müssen wir die folgenden Make-Optionen identifizieren:
-DTRIPLE=avr -DTARGET=avr
Wechseln Sie diese Optionen zu denen, die für das zu erstellende stm32f446
ARM(R)-basierte Ziel vorgesehen sind.
-DTRIPLE=arm-none-eabi -DTARGET=stm32f446
Lassen Sie uns die Befehle in ihrer Gesamtheit erläutern, um einen CMake-Build für stm32f446
(d. h. ST Microelectronics(R) STM32F446 ARM(R) mit Cortex(R)-M4F) auszuführen.
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
Wenn Sie mit CMake für andere Ziele erstellen, befolgen Sie zum Erstellen das standardmäßige *nix
-Muster. Auch das Erstellen mit CMake für x86_64-w64-mingw32
oder host
von MSYS, Cygwin oder einer ähnlichen *nix
-ähnlichen Shell oder Konsole sollte funktionieren.
Die folgende Befehlssequenz erstellt den nativen host
auf einer *nix
-ähnlichen Shell oder Konsole.
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
Es gibt auch eine Workspace-Lösung für ATMEL(R) AtmelStudio(R) 7. Sie heißt ref_app.atsln
und befindet sich ebenfalls im Verzeichnis ref_app. Sowohl für die Referenzanwendung als auch für jedes der Beispiele gibt es ATMEL Studio-Projekte. ATMEL Studio-Projekte in diesem Repository unterstützen nur das AVR-Ziel.
Wenn Sie sich für die Verwendung von ATMEL Studio entscheiden, müssen Sie für diese Projekte keine zusätzlichen Bibliotheken verwenden oder einschließen (außer denen, die normalerweise während der Standardinstallation von ATMEL Studio installiert werden).
Zieldetails, einschließlich Startcode und Linker-Definitionsdateien, finden Sie im Verzeichnis ref_app/target und seinen Unterverzeichnissen. Für jedes unterstützte Ziel-Mikrocontrollersystem gibt es eigene Unterverzeichnisse.
Die MICROCHIP(R) [ehemals ATMEL(R)] AVR(R)-Konfiguration namens target avr
läuft auf einem klassischen ARDUINO(R)-kompatiblen Board. Das Programm schaltet die gelbe LED an portb.5
um.
Die MICROCHIP(R) [ehemals ATMEL(R)] ATmega4809-Konfiguration mit der Bezeichnung target atmega4809
läuft auf einem ARDUINO(R) JEDER kompatiblen Board, das mit dem internen Resonator getaktet ist porte.2
(d. h. D5
) um.
Die Espressif (XTENSA) NodeMCU ESP32-Implementierung verwendet eine Teilmenge des Espressif SDK, um die Referenzanwendung mit einer einzigen Betriebssystemaufgabe ausschließlich auf einem ihrer Kerne auszuführen.
Die ARM(R) Cortex(R)-M0+-Konfiguration des NXP(R) OM13093 LPC11C24-Boards mit der Bezeichnung „target lpc11c24“ schaltet die LED an port0.8
um.
Die ARM(R) Cortex(R)-M3-Konfiguration ( target stm32f100
genannt) läuft auf der STM32VL-DISCOVERY-Karte, die im Handel von ST Microelectronics(R) erhältlich ist. Das Programm schaltet die blaue LED an portc.8
um.
Die zweite ARM(R) Cortex(R)-M3-Konfiguration ( target stm32l100c
genannt) läuft auf der STM32L100-DISCOVERY-Karte, die im Handel von ST Microelectronics(R) erhältlich ist. Das Programm schaltet die blaue LED an portc.8
um.
Die dritte ARM(R) Cortex(R)-M3-Konfiguration ( target stm32l152
genannt) läuft auf der STM32L152C-DISCOVERY-Karte, die im Handel von ST Microelectronics(R) erhältlich ist. Das Programm schaltet die blaue LED an portb.6
um.
Die erste ARM(R) Cortex(R)-M4F-Konfiguration (genannt target stm32f407
) läuft auf dem STM32F4-DISCOVERY-Board, das im Handel von ST Microelectronics(R) erhältlich ist. Das Programm schaltet die blaue LED an portd.15
um.
Eine weitere ARM(R) Cortex(R)-M4F-Konfiguration ( target stm32f446
genannt) läuft auf der STM32F446-NUCLEO-64-Karte, die im Handel von ST Microelectronics(R) erhältlich ist. Das Programm schaltet die grüne LED an porta.5
um. Für Interessierte wird für dieses System eine Ozone-Debug-Datei mitgeliefert.
Die erste ARM(R) Cortex(R)-M7-Konfiguration ( target stm32h7a3
genannt) läuft auf der STM32H7A3-NUCLEO-144-Karte, die im Handel von ST Microelectronics(R) erhältlich ist. Das Programm schaltet die grüne LED an portb.0
um.
Die ARM(R) A8-Konfiguration ( target am335x
genannt) läuft auf dem BeagleBone-Board (Black Edition). Für die White Edition muss der CPU-Takt reduziert werden *nix
-Distribution auf dem Board läuft. Unser Programm ist darauf ausgelegt, den BeagleBone von einer Rohbinärdatei namens MLO zu starten, die auf einer FAT32-SDHC-Mikrokarte gespeichert ist. Die Binärdatei enthält einen speziellen Boot-Header, der aus zwei 32-Bit-Ganzzahlen besteht. Das Programm wird von der SD-Karte in den RAM-Speicher geladen und anschließend ausgeführt. Beim Einschalten des BeagleBone black muss beim Einschalten des Boards die Boot-Taste (S2) gedrückt werden. Das Programm schaltet die erste Benutzer-LED (LED1 an port1.21
) um.
Die ARM(R) 1176-JZF-S-Konfiguration (genannt target bcm2835_raspi_b
) läuft auf dem RaspberryPi(R) Zero (PiZero) Single-Core-Controller. Dieses Projekt erstellt ein Bare-Metal-Programm für den PiZero. Dieses Programm läuft unabhängig von jeder *nix
-Distribution auf dem Board. Unser Programm ist darauf ausgelegt, den PiZero von einer rohen Binärdatei zu starten. Die rohe Binärdatei heißt kernel.img und ist auf einer FAT32-SDHC-Mikrokarte gespeichert. Das Programm objcopy kann verwendet werden, um Rohbinärdateien aus einer ELF-Datei mithilfe der Ausgabeflags -O binary
zu extrahieren. Die Datei „kernel.img“ wird zusammen mit drei weiteren Dateien auf der SD-Karte gespeichert: bootcode.bin, start.elf und (optional) config.txt, alle im Internet beschrieben. Ein vollständiger Satz von PiZero-Boot-Inhalten für eine SD-Karte, auf der die Bare-Metal-Referenzanwendung ausgeführt wird, ist in diesem Repo enthalten. Das Programm schaltet die GPIO-Status-LED am GPIO-Index 0x47
um.
Die Zielkonfiguration rpi_pico_rp2040
verwendet den RaspberryPi(R) Pico RP2040 mit Dual-Core ARM(R) Cortex(R)-M0+ getaktet Blinky_Pico_dual_core_nosdk
-Repo und wurde (mit großem Dank) daraus übernommen.
Die Zielkonfiguration rpi_pico2_rp2350
verwendet den RaspberryPi(R) Pico2 RP2350 mit Dual-Core ARM(R) Cortex(R)-M33, getaktet mit 2040
. In ähnlicher Weise wurde das Dual-Core-Startup durch die Bemühungen vorangetrieben, die im modernisierten Blinky_Pico2_dual_core_nosdk
-Repo offenbart wurden.
Das Ziel v850es_fx2
verwendet einen klassischen Renesas(R) V850es/Fx2-Kern. Zum Einsatz kommt das Mikrocontroller-Derivat upd703231 auf einem F-Line Drive It Starterkit.
Das riscvfe310
-Ziel nutzt den SiFive RISC-V FE310 SoC auf dem im Handel erhältlichen Red Thing Plus Board von Spark Fun. Die blaue LED am Port GPIO0.5
ist umgeschaltet.
Die Adaption für wch_ch32v307
läuft auf dem WCH CH32v307-Board. Es verwendet den Mikrocontroller RISC-V CH32v307 von Nanjing Qinheng Microelectronics Co., Ltd. Die blaue LED1, die manuell über eine Kabelverbindung mit Port GPIOC.0
verbunden ist, sorgt für den blinkenden Umschalter. Die ähnliche Anpassung wch_ch32v307_llvm
ist im Wesentlichen dieselbe, außer dass sie eine LLVM-RISC-V-Toolchain anstelle von GCC RISC-V verwendet.
Target nxp_imxrt1062
läuft auf dem Teensy 4.0-Board von Spark Fun. Die orangefarbene Benutzer-LED wird umgeschaltet.
Für andere kompatible Boards können Sie mich gerne direkt kontaktieren oder ein Problem mit der Bitte um Unterstützung für Ihr gewünschtes Zielsystem einreichen.
Benchmarks bieten skalierbare, tragbare Mittel zur Identifizierung der Leistung und der Leistungsklasse des Mikrocontrollers. Weitere Informationen finden Sie in den Detailinformationen auf den Benchmarks-Seiten.
Projekte in diesem Repo werden ohne Betriebssystem im nackten Bare-Metal-Modus unter Verwendung von selbst geschriebenem Startcode programmiert. Es werden keine externen Bibliotheken außer nativem C++ und seinen eigenen Standardbibliotheken verwendet.
Betrachten Sie zum Beispiel die BeagleBone Black Edition (BBB, auch bekannt als target am335x
), eines von mehreren beliebten Zielsystemen, die in diesem Repository unterstützt werden. Die Projekte auf diesem Board booten von der Binär-Image-Datei MLO auf der SD-Karte. Wie alle anderen Projekte in diesem Repository führen die BBB-Projekte ihre eigene statische Initialisierung und Chip-Initialisierung durch (dh in diesem speziellen Fall die Chip-Initialisierung des ARM(R) 8 AM335x-Prozessors). Die BBB-Projekte springen nach der Initialisierung anschließend zu main()
das den am335x
MCAL initialisiert und unseren selbstgeschriebenen Multitasking-Scheduler startet.
Das Bild unten zeigt die Bare-Metal-BeagleBone Black Edition in Aktion. In diesem Bare-Metal-Betriebsmodus gibt es kein laufendes *nix
-Betriebssystem auf der BBB, keine Tastatur, keine Maus, keinen Monitor, keine Debug-Schnittstelle und keinen Emulator.
Der Mikrocontroller auf der Platine führt zyklisch einen der oben genannten Benchmarks durch. Die erste Benutzer-LED wird im Multitasking-Betrieb an port1.21
umgeschaltet und das Oszilloskop erfasst eine Echtzeitmessung des Zeitsignals des Benchmarks am digitalen I/O port1.15
, Stiftleiste P8.15
des BBB.
Die Build-Status-Badges stellen den Status der nächtlichen CI-Builds und Tests dar.
avr-gcc
Toolchain Das Repo ckormanyos/avr-gcc-build erstellt aktuelle avr-gcc
Toolchains für x86_64-linux-gnu
und x86_64-w64-mingw32
. Shell- und YAML-Skripte erstellen avr-gcc
direkt aus dem Quellcode auf GHA-Läufern. Darüber hinaus stellen gelegentliche GitHub-Releases vorgefertigte avr-gcc
-Toolchains für x86_64-linux-gnu
und x86_64-w64-mingw32
bereit.
Dieses Repo ist ein großartiger Ort, um zu lernen, wie Sie Ihre eigene avr-gcc
Toolchain aus dem Quellcode erstellen. Die unkomplizierten, gut beschriebenen Shell- und YAML-Skripte sind leicht zu verstehen, zu verwenden oder anzupassen.
Wie oben erwähnt, wird ein viel detaillierterer und breiterer Umfang eingebetteter Toolchains in ckormanyos/real-time-cpp-toolchains beschrieben. Dazu gehören die oben erwähnte avr-gcc
-Toolchain sowie andere (von denen einige anderswo schwer zu finden sind).
Die Referenzanwendung und die Beispiele (auch die Codeschnipsel) können mit GNU/GCC-Compilern und GNUmake auf *nix
erstellt werden. Es wird davon ausgegangen, dass GNU/GCC-Cross-Compiler und GNUmake unter *nix
im standardmäßigen ausführbaren Pfad verfügbar sind, beispielsweise nach standardmäßigen Get-Install-Praktiken.
Einige portierte GNU/GCC-Cross-Compiler für Win*
sind im Toolchains- Repository real-time-cpp-toolchains verfügbar. Diese können mit den Mikrocontroller-Lösungskonfigurationen in der Referenzanwendung beim Entwickeln/Erstellen in Microsoft(R) VisualStudio(R) verwendet werden. Verschiedene andere GNU-Tools wie GNUmake, SED usw. wurden portiert und sind dort zu finden. Diese werden in den Makefiles verwendet, wenn Cross-Embedded-Projekte wie ref_app
unter Win*
erstellt werden.
In der Referenzanwendung unter Win*
verwenden die Makefiles einen selbstdefinierten Standardspeicherort für die jeweiligen Tools und GNU/GCC-Toolchains. Der Standardspeicherort der Toolchain unter Win*
ist ./ref_app/tools/Util/msys64/usr/local
. Dieser spezielle Toolchain-Speicherort ist vom msys2
/ mingw64
-System inspiriert.
Dort sollten sich Toolchains befinden, die für Cross-MSVC/GCC-Builds unter Win*
gedacht sind. Diese Toolchains sind nicht Teil dieses Repositorys und müssen separat erworben werden, wenn die unterstützten Win*
-Builds verwendet werden und optional VisualStudio(R)-Projekte mit CMD Batch verwendet werden.
Detaillierte Anweisungen zum Abrufen und Verwenden der Toolchains für Cross-MSVC/GCC-Builds unter Win*
sind im real-time-cpp-toolchains-Repository verfügbar. Diese Anweisungen bieten Anleitungen zur Verwendung dieser Toolchains bei der Auswahl des Microsoft(R) VisualStudio(R)-Projekts (über den üblichen, oben beschriebenen MSVC/ Win*
-Weg) zum Erstellen der Referenzanwendung.
Für die Erstellung der Referenz ist ein GNU/GCC-Port (oder ein anderer Compiler) mit einem hohen Maß an C++14-Kenntnis und -Konformität (oder höher) erforderlich, z. B. GCC 5 bis 13 (höher ist im Allgemeinen vorteilhafter) oder MSVC 14.2 oder höher Anwendung (sowie die Beispiele und Codeausschnitte).
Einige der Codeausschnitte demonstrieren Sprachelemente nicht nur aus C++14, sondern auch aus C++17, 20, 23 und höher. Ein Compiler mit C++17-Unterstützung oder sogar C++20, 23-Unterstützung (wie GCC 13, Clang 15, MSVC 14.3 oder höher) kann daher für den Erfolg mit allen Codefragmenten von Vorteil sein.
<chrono>
, <ratio>
und einige interne Traits-Header sind unter der GNU General Public License Version 3 oder höher lizenziert.