Abschnitt 9.3, „Echtzeitbetriebssystem“: Beispiel task_demo

Das Beispiel umfasst die in Kapitel 9 besprochenen, in den Listings gezeigten Verfahren.

Über die Konfiguration kann eingestellt werden, ob der LED-Task in der Hauptschleife den Task-Status zyklisch abfragen und in der Konsole ausgeben soll. Ebenso kann der Mechanismus der Zustellung des Knopfdrucks eingestellt werden. Zur Wahl stehen eine Semaphore und eine Queue.

Konfiguration des Beispiels

Verwendet ein beliebiges Board mit ESP32-C3 Mikrocontroller.

Abschnitt 7.5, „WS2812B“: Blink Example

Das ESP-IDF Beispiel blink zeigt die Verwendung der WS2812B-LED mittels EMT-Peripheriemodul. Listing 7.8 des Buchs komprimiert das Beispiel etwas und nennt den LED-Strip aus Konsistenzgründen gLedStrip (statt im Beispiel led_strip).

In der Konfiguration kann statt der WS2812B-LED eine LED an einem beliebigen GPIO per Push-/Pull-Schaltung betrieben werden:

Konfiguration des blink Beispiels

Zum Treiben von LEDs siehe auch Abschnitt 5.4., „LED schalten“.

Abschnitt 7.4, „SPI-Schnittstelle“: Beispiel sdcard_demo

Es zeigt die Ansteuerung einer SD-Karte über SPI. Ein entsprechender SD-Kartenadapter muss dafür an die Pins 5 (MOSI), 6 (MISO), 4 (SCK) und 7 (CS) angeschlossen werden. Micro-SD-Kartenadapter sind auch geeignet. Ein beliebiges Board mit ESP32-C3 Mikrocontroller ist geeignet.

Beim ausgewählten SD-Kartenadapter muss auf die Spannung geachtet werden. Der Adapter von AZ-Delivery arbeitet mit einer Versorgungsspannung von 5V. Hier wird wie folgt verbunden (die Pins sind auf der Platine beschriftet):


ESP32-C3 <-> SDCard-Adapter

  • GPIO7 <-> CS
  • GPIO5 <-> MOSI
  • GPIO6 <-> MISO
  • GPIO4 <-> SCK
  • 5V <-> VCC
  • GND <-> GND

Als Basis diente das ESP-IDF Beispiel sdspi, das auf die Basisfunktionalität reduziert wurde.

Abschnitt 6, „Interrupts und Exceptions“: Beispiel interrupt_demo

Beispiel des Buchs „Embedded Systems mit RISC-V“, dpunkt.verlag

Die Arbeitsweise ist in Kapitel 6 Interrupts und Exceptions beschrieben.

Die Systick-Funktionalität wurde mit einem General Purpose Timer implementiert.

Eine LED an GPIO4 wird bei Betätigung des Tasters an GPIO6 mit Interruptauslösung geschaltet. Zusätzlich wird über den General Purpose Timer ermittelte Zeit in der Konsole ausgegeben.

Über die Konfiguration kann eingestellt werden, ob das Beispiel den Tastendruck über eine globale Variable (CALLBACK_NONE), einen statischen Callback (CALLBACK_STATIC) oder einen dynamischen Callback (CALLBACK_DYNAMIC) verarbeiten soll.

Im Gegensatz zur Beschreibung im Buch wurde das Beispiel folgende Komponenten aufgeteilt:

  • systick: für die Systick-Funktionalität mit General Purpose Timer
  • led: zur Ansteuerung der LED
  • button: zur Ansteuerung des Tasters und Aufruf des Callbacks
  • main: mit der Hauptapplikation, die auf den Tastendruck reagiert

Das Beispiel verwendet die Funktionen des ESP-IDF für den Zugriff auf die Peripherie.

Siehe auch die Beispiele switch_led und leds_and_buttons für den Zugriff auf die Peripherie.

Verwendet ein beliebiges Board mit ESP32-C3 Mikrocontroller.

Abschnitt 5.5, „Taster anschließen“: Beispiel leds_and_button

Die Arbeitsweise ist in Abschnitt 5.5 Taster anschließen beschrieben.
Im Beispiel werden zwei LEDs an GPIO4 und GPIO5 bei Betätigung des Tasters an GPIO6 geschaltet.
Das Beispiel verwendet die Funktionen des ESP-IDF für den Zugriff auf die Peripherie.

Siehe auch das direkte Ansteuern der Peripherie in Beispiel switch_leds.

Abschnitt 5.4, „LED schalten“: Beispiel switch_led

Im Beispiel werden zwei LEDs an GPIO4 und GPIO5 zyklisch an- und ausgeschaltet. Das Beispiel greift direkt auf die Peripherie zu. In der Konfiguration kann festgelegt werden, ob dies über Bitmaskierung oder ein Bitfield erfolgt.

ESP32-C3 mit zwei LEDs auf der Steckplatine

Die LEDs werden in Beispiel leds_and_button über die Funktionen des ESP-IDF angesteuert. Zusätzlich wird dort auf einen Tastendruck reagiert.

Abschnitt 4, „Mikrocontroller“: Beispiel rng_test

Als Beispiel für die Ansteuerung eines Peripheriemoduls wird der Zufallszahlengenerator herangezogen. Die Arbeitsweise ist im Buch detailliert ausgeführt.

Die Konfiguration erlaubt das Einstellen der Anzahl m der Bins des Chi-Quadrat-Tests, die Anzahl der zu generierenden Zufallszahlen und den Berechnungsmodus, der bei Bin-Zuordnung verwendet wird:

rng_test Konfiguration

Abschnitt 4.2.4, „Linker“: Beispiel linkerdemo

Die im Abschnitt Linker beschriebenen Segmente .noinit und .rtc-noinit werden mit globalen Variablen belegt. Nach Ausgabe und Inkrement dieser Variablen wird ein Reset durchgeführt. So wird gezeigt, dass der Variablenwert über den Reset hinweg erhalten bleibt.

Die erwähnten Linker Scripts memory.ld und sections.ld befinden sich nach dem Build im Unterverzeichnis build/esp-idf/esp_system/ld/ des Projekts.

Der Zugriff auf die Linker-Adressen _rtc_noinit_start und _rtc_noinit_end wird im Beispiel ebenso gezeigt.

Beispielausgabe von linkerdemo

Abschnitt 3, „Der Mikroprozessor“: Beispiel sum_up_n

Die beiden Beispiele sum_up_n und sum_up_n_measurements untermauern die im Kapitel „Der Mikroprozessor“ erläuterten Konzepte. Es ist wichtig zu wissen, dass das Disassembly sich beim Nachvollziehen von dem im Buch abgedruckten unterscheiden kann. Dies liegt daran, dass der generierte Code von der Compilerversion abhängig ist.

Die Messungen wurden mit dem Projekt sum_up_n_measurements durchgeführt. Verschiedene Einstellungen in der Konfiguration ermöglichen die unterschiedlichen Messungen:

  • Use CSR Macros: wählt aus, ob die Funktionen des ESP-IDF oder inline Assembler zur Messung verwendet werden soll.
  • Calculate in function: gibt an, ob die Berechnung in einer C-Funktion oder inline durchgeführt werden soll.
  • Use constant test value: kann auf den gewünschten Eingabewert gesetzt werden, über den die Gauß’sche Summe berechnet werden soll. In einer Schleife kann er auf 0 gesetzt werden, dann werden die Eingabewerte 1, 1, 10, 100, 1000, 10000, 100000, 1000000 nacheinander verwendet.
  • Calculate in a loop: Führe mehrere (true) oder nur eine (false) Berechnung durch.
  • Type of formula: wählt die Art der Berechnung aus.