Ich bevorzuge eine klare Struktur in meinen Firmwareprojekten. Dazu gibt es über die reine Funktion hinaus wichtige Elemente.
1.: Dateistruktur :
- Funktionen sind in einer *.h für defines,
- einer *.h für Funktionsdeklaration und Doku
- und einer *.c Datei für Funktionsimplementierung aufgeteilt.
2.: logische Struktur :
- Funktionen sind atomar
- Funktionen sind wiederverwertbar
- Funktionen sind aufeinander aufbauend
- Funktionen sind dokumentiert
3.: Schnittstellen sind klar dokumentiert (z.B. durch Kommentare in der*.h Datei für die Funktionsdeklaration).
4.: Das Funktionsprinzip vermeider Sonderbehandlung von "Ausnahmefällen".
5.: Höhere Funktionen bauen auf Grundfunktionen auf (Modulares System).
6.: Funktionen sind in folgenden Projekten wiederverwendbar
(Effizienz über mehrere Projekte statt Effizienz nur in einem Projekt)
7.: das Datenmodell passt auf die technischen Gegebenheiten
8.: das programmiertechnische Fundamant wird in der Datenmodellierung berücksichtigt

Bei der Erstellung der Firmware werden Qualitätsprüfungen ständig durchgeführt.
Fehlerfreier Code ist ungetesteter Code
Dazu gehören insbesonders die folgenden Designrichlinien:
- Die erste Idee der Umsetzung ist mit Sicherheit nicht die beste Idee.
- Qualitätsloops bei der Spezifizierung und Implementierung einplanen.
- Externer Test Stimulus ist mit den normalen Funktionsaufrufen möglich.
- Debugging systemintern (Selbsttest) und systemextern (Teststand/Frontend) einplanen.
- Benchmark Funktionalität (systemintern + systemextern) ist normaler Bestandteil der Funktionen.
- exceptions (Fehlerbehandlung) und errno Rückgabewerte sinnvoll nutzen.
- Startparameter auf Konsistenz prüfen.
- RTOS erleichtert das Leben und bringt richtig angewendet Struktur für Daten und Code.
- Funktionen tauschen Daten und Kommandos über klar definierte Schnittstellen (z.B. Queues) aus.
- einen sauberen Übergang von
-> Hardwarefunktionalität (z.B. IRQ, DMA)
-> zu Echtzeitfunktion (z.B. Taskpriorität, garantierte Reaktionszeit) und
-> zu Datenverarbeitung finden

Es gibt auch wichtige "not to dos" beim Konzept und der Programmierung !
- NIEMALS Annahmen machen welcher Codeteil wann, wie oft und wie schnell abgearbeitet wird.
- NIEMALS globale Variablen für die Programmablaufsteuerung verwenden.
- NIEMALS per copy&paste Code aus älteren Projekten ungeprüft übernehmen.

Für Linux Mint 21 ist mein derzeit bevorzugtes Linux System. Um das System schnell aufzusetzten habe ich mir ein Skript vorbereitet das das automatisiert.
Linux Mint 21 Quick Setup
Arduino und ESP32 sind ja recht populär, darum hier eine Kostprobe.
additional Arduino Board Support
Arduino Lilygo TWatch2020-V1 Basics
Hier stelle ich mal ein paar ältere Programmierbeispiele aus meiner Feder vor. Nichts weltbewegendes, aber mir
hilft es, die Grundlagen immer präsent zu haben. Auf die Überschrift klicken zum Download.
STM32F103CB bluepill ili9341
Eine kleine Demonstration vom Bluepill Board mit einem ili9341 TFT an PB12-PB15 mit SPI2-CS/CLK/MISO/MOSI und PA9-DC und PA10-RST
STM32F4-Disco BSP
STM32F4-Disco BSP Binary
Zum Einstieg ist das B(oard)S(upport)P(ackage) immer eine gute Wahl.
STM32F429i-Disco BSP
STM32F429i-Disco BSP Binary
Zum Einstieg ist das B(oard)S(upport)P(ackage) immer eine gute Wahl.
STM32F746G-Disco
STM32F746G-Disco Binary
Zum Einstieg ist das B(oard)S(upport)P(ackage) immer eine gute Wahl.
STM32F769i-Disco BSP
STM32F769i-Disco BSP Binary
Zum Einstieg ist das B(oard)S(upport)P(ackage) immer eine gute Wahl.

ein C++ Template wie aus dem Lehrbuch für Klassen. Mit Eclipse CDT bzw Wascana getestet (benötigt make)
Template_C++.zip
Und hier ein AVR Studio 4 / WinAVR Projekt in C für den Atmel ATtiny13a. Hauptsächlich als Experimentier-
projekt für das Steckbrett gedacht. Das Programm bringt die LEDs an PortB-0:2 abwechselnd zum Leuchten, eine LED an
PortB-4 blinkt Timer gesteuert und ein Interrupt durch eine High Flanke auf PortB-3 ändert das Blinkverhalten von
PortB-4.
ATtiny13A_Beispiel.zip
Und hier das "Roulette" AVR Studio 4 / WinAVR Projekt in C für den Atmel ATtiny13a.
Ist nur eine kleine Fun Applikation für das Roulette PCB Projekt. Pseudo zufällig
wird eine der 4 LEDs an geschaltet wenn man die Taste drückt. Nach einer kurzen Dauer wird
die LED wieder gelöscht und das Spiel kann von vorne los gehen.
Roulette Zufallsgenerator
Und hier das "Tiny_Timer" AVR Studio 4 / WinAVR Projekt in C für den Atmel ATtiny13a.
Soll als Übung für den Timer0 in den Atmel 8-Bittern dienen.
ATtiny13a Timer
Und hier das "Tiny_Timer+ADC" AVR Studio 4 / WinAVR Projekt in C für den Atmel ATtiny13a.
Soll als Übung für den ADC in den Atmel 8-Bittern dienen. Die Schaltung für das Programm sollte
wie auf dem Bild beschrieben aufgebaut sein.
ATtiny13a Timer+ADC