Immer wieder werden wir gefragt, was wir eigentlich bei Logima so machen. “Gerätezentrierte Software” steht auf unserer Webseite — aber was steckt konkret dahinter?
Dieser Beitrag gibt einen Einblick in ein Gebiet, das bei uns in den letzten Jahren immer mehr an Bedeutung gewonnen hat: die professionelle Firmwareentwicklung für STM32-Mikrocontroller.
Hier eine beschreibung eines unserer letzten Projekte.
Die Aufgabe: Firmware für ein Medizinprodukt
Firmware zu schreiben, die auf einem Microcontroller läuft, ist eine tolle Sache. Firmware zu entwickeln, die zuverlässig in einem anspruchsvollen Umfeld – mit Multithread-Betrieb, Echtzeitmessungen, mehreren Kommunikationsprotokollen und hohen Qualitätsanforderungen – ihren Dienst tut, ist eine ganz andere, aber dafür umso spannendere Herausforderung.
Es muss auch nicht jede Software zertifiziert sein. Firmware, die in einem Medizinprodukt steckt, schon. Und auch das bieten wir an. Das bedeutet: Dokumentierte Architekturentscheidungen, nachvollziehbare Testverfahren (inklusive Unit-Test), statische Codeanalyse — und das alles auf einem Mikrocontroller mit 512 KB Flash und 128 KB RAM. Damit kann das Produkt am Ende nach der Medical Device Regulation (MDR) zugelassen werden.
Das klingt vielleicht wiedersprüchlich, aber es ist eine Herausforderung die wir gerne angehen.
Die Plattform: STM32 mit ARM Cortex-M4
Wir entwickeln für den STM32G4 — einen leistungsstarken ARM Cortex-M4 mit 170 MHz, Hardwarefließkommaeinheit (FPU) und erweiterten Peripheriemöglichkeiten. Mit der STM32CubeIDE und dem ARM GCC Toolchain entsteht aus unserem C++-Quellcode eine fertige Binärdatei für den Microcontroller.
Gleichzeitig nutzen wir Visual Studio für die Entwicklung — zum einen für die Unit-Test und automatisierten Systemtests und zum anderen wegen der besseren Erfahrung und Unterstützung beim Schreiben des Codes (Intellisense und Co.).
Echtzeitbetrieb mit FreeRTOS
Embedded-Systeme sind selten einfach. Signale müssen gemessen, Protokolle beantwortet und Parameter überwacht werden — gleichzeitig. Dafür nutzen wir FreeRTOS über die CMSIS-RTOS V2-Schnittstelle.
Threads, Mutexe, Queues, Semaphoren und StreamBuffer — das sind die Werkzeuge, mit denen wir die Nebenläufigkeit handhaben. Wir haben dabei klare Regeln: In Interrupts steckt nur minimale Logik. Die eigentliche Arbeit übernehmen Task-Queues. Critical Sections sind die Ausnahme, nicht die Regel.
C++20 — mit Augenmaß
Wir schreiben die Firmware in C++20, da uns das echte Vorteile bringt: Lesbarkeit, Wiederverwendung, Testbarkeit.
Gleichzeitig gelten klare Grenzen: Keine Exceptions (zu viel Overhead), kein unkontrolliertes STL (dynamische Allokation). Dynamische Speicherverwaltung findet ausschließlich in der Initialisierungsphase statt — danach nicht mehr.
Wir orientieren uns konsequent an den C++ Core Guidelines und nutzen die Guidelines Support Library (GSL) für mehr Typ- und Speichersicherheit.
Gleichzeitig nutzen wir C17 für für den HAL-nahen Plattformcode. Das ist eine bewusste, architektonisch begründete Entscheidung: Dort, wo C++ keine Vorteile bringt, bleibt es bei C. Und dort, wo modernes C++ hilft — bei Typsicherheit, Abstraktion oder Kapselung — nutzen wir es konsequent.
Kommunikation: Mehrere Protokolle, eine Firmware
In unserem Projekteinsatz implementierten wir mehrere serielle Kommunikationsprotokolle — ein Legacy-ASCII-Protokoll für Abwärtskompatibilität, ein modernes binäres Protokoll und einen Impulsmodus für Direktmessung. Die Firmware erkennt und bedient alle drei.
Solche Mehrfach-Protokollunterstützung ist typisch für Messgeräte, die in bestehende Systemlandschaften integriert werden müssen. Wir haben gelernt, wie man das sauber modular aufbaut — ohne dass es zur Spaghetti-Architektur wird.
Qualität, die dokumentiert ist
Firmware für regulierte Märkte braucht Nachweise. Wir liefern sie:
- Unit-Tests mit GoogleTest, die direkt in Visual Studio laufen
- Integrationstests, die mehrere Schichten durchstechen
- Systemtests auf echter Hardware — hochautomatisiert, direkt aus der Kommandozeile ausführbar
- Statische Codeanalyse mit den Microsoft Native Code Analyzers, eingebunden in den Build-Prozess
- Doxygen-Dokumentation für alle relevanten Schnittstellen
- Build-Server die automatisiert den Code compilieren und die Tests ausführen, um sicherzustellen, dass Änderungen auch auf anderen Systemen nachvollziehbar funktionieren.
Jede Entscheidung, die die Architektur beeinflusst, wird als Architecture Decision Record (ADR) festgehalten. So weiß jeder im Team — und auch zukünftige Entwickler — warum etwas so ist, wie es ist.
Was uns dabei wichtig ist
Embedded-Entwicklung ist im Kern nichts anderes als Softwareentwicklung — mit denselben Anforderungen an Wartbarkeit, Tests und Qualität, nur unter deutlich engeren Rahmenbedingungen.
Unser Ansatz: solides Software-Handwerk in die Embedded-Welt zu bringen. Mit klarer Struktur, pragmatischer Disziplin und dem Anspruch, Code zu hinterlassen, den wir auch in mehreren Jahren noch verstehen.
Übrigens setzen wir auch in anderen Softwareprojekten mit kleineren Controllern Qualitätsstandards um, beispielsweise mithilfe von Unit-Tests, auch wenn wir nur C und nicht C++ als Programmiersprache nutzen.
Sie entwickeln ein Gerät und braucht jemanden, der die Firmware dazu schreibt? Melden Sie sich — wir freuen uns auf das Gespräch: logima.net/contact

