Entwicklung von Embedded Devices und Embedded Systems – ein Überblick

Bei Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwickler eingebetteter Systeme und Sicherheitsmanager bei der Erstellung sicherer Systeme zu unterstützen, erschließen wir nun den Bereich der Sicherheit für eingebettete Systeme. In diesem Beitrag teilen wir die wichtigsten Erkenntnisse, die Entwickler und Architekten über den Aufbau sicherer eingebetteter Systeme wissen sollten.
Ein eingebettetes Gerät ist eine eigenständige Recheneinheit mit eigener mikroprozessorgestützter Hardware und Software. Sie werden typischerweise für dedizierte Funktionen eingesetzt, entweder unabhängig oder als Teil größerer Systeme.
Was ist ein eingebettetes Gerät und ein eingebettetes System?
Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung spezifischer Funktionen programmiert sind. Je nach Verwendungszweck kann die Komplexität eingebetteter Geräte variieren.
Wenn ein eingebettetes System komplizierte, ressourcenintensive Vorgänge ausführen muss, kann die Hardware mehrere Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten umfassen. Ist es jedoch für eine einfache Aufgabe konzipiert, enthält es möglicherweise nur einen einzigen Mikrocontroller.
Einige eingebettete Systeme sind Black-Box-Systeme ohne Benutzeroberfläche, während andere über detaillierte grafische Benutzeroberflächen verfügen können.
Beispiele für eingebettete Geräte
Eingebettete Geräte finden in zahlreichen Branchen Anwendung: von der Luft- und Raumfahrt bis zur Computertechnik und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind einige Beispiele:
- Ein Thermostat in einer Klimaanlage.
- Ein Fitness-Tracker mit kleinen elektrischen Komponenten und einem winzigen Betriebssystem, der lediglich Gesundheitsdaten aufzeichnen und synchronisieren kann.
- Digitale Klimatisierungssysteme.
- Navigationssysteme in einem Flugzeug.
- Digitale Armbanduhren.
- GPS-Geräte.
- WLAN-Komponenten in Mikrowellenherden und anderen Unterhaltungselektronikgeräten.
- Blutdruck- und Herzfrequenzmessgeräte.
- Netzwerkkomponente in einem MRT-Gerät, die Daten an die Cloud sendet.
Ist ein Laptop ein eingebettetes Gerät?
Kurze Antwort: Nein. Lange Antwort:
Per Definition kapselt ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Erfüllung seiner Funktionen benötigt. Ein Laptop umschließt zwar verschiedene Hardwarekomponenten in einem Metallgehäuse und umfasst die gesamte Software, die er zur Bereitstellung seines Funktionsumfangs benötigt.
Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch eher ein Allzweckgerät und kann für eine Vielzahl von Aktivitäten verwendet werden.
Eingebettete Geräte im Internet der Dinge
Eingebettete Systeme bilden das Herzstück des IoT. Ihr intelligenter Kühlschrank lässt sich dank eines eingebetteten Geräts über Ihr Mobilgerät steuern. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, das es Ihnen ermöglicht, CCTV-Aufnahmen aus tausenden Kilometern Entfernung anzusehen. Und wenn Sie einen Knopf drücken, um Ihr Auto in den Autopiloten zu versetzen, ist es im Hintergrund ein eingebettetes Gerät, das die ganze Magie vollbringt.
Lebenszyklus der Entwicklung eingebetteter Software
Der typische Softwareentwicklungszyklus für ein eingebettetes System umfasst die folgenden Schritte:
Schritt 1: Zweck und Anforderungen
Ein eingebettetes Gerät verfügt über einen spezifischen und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, den Zweck und die Anforderungen vor Beginn der Entwicklung explizit festzulegen. Es empfiehlt sich, ein detailliertes Design-Dokument für das System zu erstellen. Beantworten Sie Fragen wie:
- Welche Funktionen soll das Gerät ausführen?
- Wird es Teil einer anderen Maschine sein oder eigenständig funktionieren?
- Soll das Gerät über eine Benutzeroberfläche verfügen? Falls ja, reicht eine Befehlszeile aus oder ist eine grafische Oberfläche erforderlich?
- Welche Grenzwerte für Größe, Kosten oder Stromverbrauch muss das Gerät einhalten?
- Gibt es Leistungsbenchmarks? Muss das Gerät beispielsweise in Echtzeit oder innerhalb bestimmter Zeitvorgaben reagieren?
Schritt 2: Systemarchitektur
Sobald wir die spezifischen Systemanforderungen identifiziert haben, können wir die Systemarchitektur entwerfen. Beantworten Sie Fragen wie:
- Welche Hardwarekomponenten werden für die Entwicklung des Geräts benötigt? Dazu gehört die Identifizierung der Schaltkreise, Prozessorchips und Mikrocontroller sowie aller erforderlichen internen und externen Peripheriegeräte.
- Wie hoch ist der Strombedarf der Komponenten?
- Wird das Gerät mit dem Internet verbunden sein?
- Welche Schnittstellen müssen hinzugefügt oder entwickelt werden, damit das Gerät mit anderen Geräten oder der übergeordneten Maschine kommunizieren kann?
- Wie implementieren Sie die Verschlüsselung? (Denken Sie an Algorithmen, Schlüsselspeicherung usw.)
- Wie identifizieren und vermeiden Sie potenzielle Schwachstellen, Exploits und Malware?
Schritt 3: Auswahl des Betriebssystems
Die Wahl des Betriebssystems bestimmt oft die Effizienz Ihrer eingebetteten Anwendungen, wählen Sie also mit Bedacht. Windows for IoT mag bei der Grafik punkten, lässt aber Hardware-Unterstützung vermissen. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows for IoT Lizenzgebühren anfallen.
Bei Open-Source-Systemen wie Linux und Android haben Ihre Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen sind Sie auf den Standard-Funktionsumfang des Kernels beschränkt.
Bei der Wahl eines Betriebssystems ist es zudem wichtig, die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches zeitnah veröffentlicht, falls Schwachstellen entdeckt werden? Gibt es einen integrierten Schutz gegen die gängigsten Cyberangriffe?
Schritt 4: Die Entwicklungswerkzeuge
Verschiedene Programmiersprachen und Frameworks haben unterschiedliche Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionsumfang, Geschwindigkeit und Zuverlässigkeit können Sie sich für die eine oder andere Sprache bzw. das eine oder andere Framework entscheiden.
Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung benötigen, ist Java eine gute Wahl.
Für den schnellsten Durchsatz sollten Sie jedoch C/C++ wählen. Wenn Sie die beste Unterstützung durch Bibliotheken von Drittanbietern wünschen, ist Python die richtige Wahl.
Schritt 5: Programmieren, Refactoring, Testen, Programmieren
Sobald Sie sich für die Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme sensible Geräte mit begrenzten Hard- und Software-Ressourcen sind. Es ist daher von entscheidender Bedeutung, bewährte Verfahren für Anwendungssicherheit und Leistung zu berücksichtigen.
Code-Reviews helfen dabei, den Code zu optimieren und potenzielle Fehler zu identifizieren. Sie müssen zudem so gründlich wie möglich testen. Stellen Sie sicher, dass Sie eine umfassende Liste aller Testfälle erstellen, auf die das Gerät im produktiven Einsatz stoßen könnte.
Schritt 6: Wartung und Support
Wie bei jeder anderen Anwendung oder jedem anderen Gerät endet der Lebenszyklus nicht mit der Auslieferung und Installation des eingebetteten Systems. Während das Gerät im produktiven Einsatz ist, werden neue Anwendungsfälle identifiziert, die neue Funktionen erfordern. Gemeldete Fehler können zudem die Veröffentlichung neuer Firmware-Updates notwendig machen.
Die besten Programmiersprachen für eingebettete Systeme
Es gibt viele angesehene Organisationen wie IEEE und TIOBE, die Programmiersprachen nach Beliebtheit und Nutzung bewerten. Doch egal, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, ein gemeinsames Thema fällt sofort auf.
Die Top 3 der Sprachen sind immer C, Python und Java. Der TIOBE-Index für Juli 2021 führt C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut dem Ranking von IEEE Spectrum für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java und dann C.
Worin unterscheiden sich Firmware-Lösungen, die in Java, C oder Python geschrieben wurden?
Verschiedene Sprachen verwalten Speicher, Betriebssysteminteraktionen und Laufzeitumgebungen auf unterschiedliche Weise. Java-Anwendungen werden beispielsweise in einer speziellen Laufzeitumgebung ausgeführt, der sogenannten Java Virtual Machine (JVM).
Die Speicherverwaltung in C/C++ erfolgt manuell. In Java oder Python müssen Sie sich hingegen nicht selbst darum kümmern; die Sprache übernimmt das für Sie. Mehr noch: In C müssen Sie Ihren „Müll“ selbst beseitigen – wenn Sie also Speicher dynamisch zuweisen, müssen Sie ihn explizit wieder freigeben. Tun Sie das nicht, führt dies zu einem Speicherleck. In Java oder Python erfolgt die Garbage Collection automatisch. Allerdings ist C von Natur aus deutlich schneller als Java oder Python.
Ein Punkt, in dem C und Java (insbesondere C) gegenüber Python das Nachsehen haben, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine umfangreichere Datenbank an Bibliotheken, was es Entwicklern deutlich erleichtert, bestimmte Funktionen hinzuzufügen.
Wählen Sie C, wenn:
- Sie eine hardwarenahe Schnittstelle zum Betriebssystem benötigen.
- Sie die bestmögliche Performance anstreben.
- Ihre Entwickler über fundierte C/C++-Kenntnisse verfügen.
- Sie keinen großen Bedarf an externen Bibliotheken von Drittanbietern haben.
Entscheiden Sie sich für Python, wenn:
- Sie Algorithmen für Data Science oder maschinelles Lernen implementieren möchten.
- Sie auf eine große Auswahl an Drittanbieter-Bibliotheken angewiesen sind.
- Sie bereit sind, zugunsten der Benutzerfreundlichkeit auf etwas Geschwindigkeit zu verzichten.
- Sie nur wenig Erfahrung in der Embedded-Entwicklung haben.
- Sie keine hardwarenahe Schnittstelle zum Betriebssystem oder zur Hardware benötigen.
Wählen Sie Java, wenn:
- Sie Webanwendungen entwickeln.
- Sie eine einfachere Entwicklung als mit C wünschen, aber dennoch mehr Performance als mit Python benötigen.
- Sie keinen großen Bedarf an externen Bibliotheken von Drittanbietern haben.
Wird C langsam seine Spitzenposition in der Embedded-Entwicklung verlieren?
Hochsprachen erleichtern das Programmieren, indem sie Komplexitäten abstrahieren, die sich in C nicht vermeiden lassen. Dennoch ist C seit Jahrzehnten trotz der Veröffentlichung ausgefeilterer Sprachen und Frameworks eine der ersten Wahlen in der Embedded-Entwicklung.
Das liegt daran, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die C bietet, nach wie vor unübertroffen sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich Laufzeitumgebung, Sprache und Compiler) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.
Dennoch ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwerer zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwickler-Community. Auch der Boom bei der Entwicklung von KI- und ML-Anwendungen bewegt viele dazu, Python statt C zu wählen, einfach weil es eine bessere Bibliotheksunterstützung bietet.
Man sollte bedenken, dass Python erst seit Kurzem Teil der Debatte um die besten Embedded-Programmiersprachen ist. Ja, die Verbreitung mag in den kommenden Jahren weiter zunehmen, aber wir gehen nicht davon aus, dass C jemals aufhören wird, eine der führenden Sprachen für die Embedded-Entwicklung zu sein.
Warum sichere Programmierung in C/C++ so wichtig ist
Beim Schreiben von Code in C/C++ kann viel schiefgehen. Der Zugriff auf eine Speicheradresse, die keine gültigen Daten mehr enthält, oder die fehlerhafte gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz der gesamten Anwendung führen.
Bei eingebetteten Geräten sind diese Auswirkungen weitaus gravierender, da ein Absturz dazu führen kann, dass eine größere Maschine den Dienst versagt. Wenn beispielsweise das Autopilot-Modul eines Autos ausfällt, kann das Fahrzeug Hindernissen nicht mehr ausweichen.
Hier sind weitere Gründe, warum die sichere Programmierung von C/C++-Anwendungen so wichtig ist:
- Unsichere Speicherverwaltung (Null-Pointer, Speicherbeschädigung, Stack-Overflows, Puffer- und Heap-Overflows) führt zum Absturz der gesamten Anwendung.
- Pointer sind fester Bestandteil von C und C++. Ihr Umgang erfordert höchste Sorgfalt und fundierte Kenntnisse der zugrunde liegenden Konzepte.
- Die Garbage Collection erfolgt manuell. Programmierer müssen daher dynamisch zugewiesenen Speicher explizit freigeben. Nicht oder falsch freigegebener Speicher kann zu Speicherlecks oder Beschädigungen führen.
- Es fehlen standardisierte APIs für komplexe Datenstrukturen (z. B. Hash-Tabellen, Sets etc.), was Entwickler dazu zwingt, das Rad neu zu erfinden.
Es ist absolut entscheidend, dass Entwickler in sicherer Programmierung für C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte Lernplattform mit interaktiven Challenges, Kursen und Assessments, die Entwickler befähigen, sicheren C/C++-Code zu schreiben. Dabei geht es um sprach- und frameworkspezifische Inhalte, nicht nur um allgemeine theoretische Schulungen.
Erfahren Sie, wie wir die Automobil- und Transportbranche unterstützen. Oder probieren Sie noch heute eine Coding-Challenge mit Fokus auf Embedded-Systeme aus und erleben Sie, wie wir Entwickler beim Schreiben sicherer Embedded-Anwendungen unterstützen!
Kontrollieren Sie KI-gestützte Entwicklung, bevor sie in Produktion geht
Bewerten Sie KI-gestützte Risiken, setzen Sie Richtlinien für sicheren Code direkt beim Commit durch und beschleunigen Sie die sichere Bereitstellung über Ihren gesamten SDLC hinweg.
Weitere Blogs entdecken
Erhalten Sie Zugang zu Experteninhalten über sichere Programmierung, KI-Governance und Software-Risikomanagement.
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

Eine Sicherheitskultur: Wie Sage sein Champions-Programm aufgebaut hat
Erfahren Sie, wie Sage die Sicherheit durch einen flexiblen, beziehungsorientierten Ansatz gestärkt, über 200 Security Champions ausgebildet und eine messbare Risikoreduzierung erzielt hat.

Cybersecurity Awareness Month 2026: Das Verständnis von KI-Sicherheit ist entscheidend für die Unternehmensverteidigung
Wir haben einen Punkt erreicht, an dem die meisten führenden KI-Unternehmen öffentlich eine weltweite Verlangsamung der KI-Entwicklung gefordert haben, damit die Sicherheitsvorkehrungen Schritt halten können. Doch die Wahrheit ist: Ernsthafte Sicherheitsprobleme sind bereits Realität geworden. Dies bringt unzählige Sicherheitsverantwortliche und Führungsteams in eine dringliche Lage, da die finanziellen Kosten und Risiken durch die Implementierung von KI stetig steigen.

Enabler 8: Branding für Ihr Programm
Ein Programm für sicheres Programmieren braucht mehr als nur großartige Inhalte, um erfolgreich zu sein. Enabler 8 zeigt, wie Branding die Teilnahme zu einem begehrten, statusorientierten Erlebnis macht.
.avif)
Jeder Mitarbeiter steht jetzt an vorderster Front der KI-Cybersicherheit
Die Unternehmenslandschaft wandelt sich mit einer Geschwindigkeit, die kaum jemand vorhergesehen hat, bis es zu spät war. Wir haben offiziell die Schwelle von handgeschriebenem Code und einfacher Copilot-Unterstützung hin zur Ära des Agentic Development Lifecycle (ADLC) überschritten. Während autonome KI-Agenten eine beispiellose Effizienz in vielen Bereichen versprechen, bringen sie auch eine völlig neue Klasse von Sicherheits- und Regulierungsrisiken mit sich.
Sichere KI-gestützte Entwicklung vor dem Release
Erkennen Sie Entwicklerrisiken, setzen Sie Richtlinien durch und verhindern Sie Schwachstellen über den gesamten Softwareentwicklungszyklus hinweg.