SCW-Symbole
Held-Hintergrund ohne Trennlinie
Blog

Développement de dispositifs embarqués et de systèmes embarqués : un aperçu

Secure Code Warrior
Veröffentlicht Aug 11, 2021
Zuletzt aktualisiert am 08. März 2026

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente 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 umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt 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 viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Check out how we help automotive and transportation industries. Or try un défi de codage axé sur l'intégration dès aujourd'hui pour découvrir comment nous donnons aux développeurs les moyens d'écrire des applications embarquées sécurisées !

Ressource anzeigen
Ressource anzeigen

In diesem Beitrag erhalten Sie einen Überblick über eingebettete Geräte und die Entwicklung eingebetteter Systeme.

Möchten Sie mehr erfahren?

Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.

mehr erfahren

Secure Code Warrior Ihr Unternehmen dabei, den Code während des gesamten Softwareentwicklungszyklus zu sichern und eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Ganz gleich, ob Sie für die Anwendungssicherheit verantwortlich sind, Entwickler, IT-Sicherheitsbeauftragter oder in einer anderen Funktion im Bereich Sicherheit tätig sind – wir können Ihrem Unternehmen dabei helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.

Demo buchen
Teilen auf:
LinkedIn-MarkenSozialx Logo
Autor
Secure Code Warrior
Veröffentlicht Aug 11, 2021

Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.

Cet article a été rédigé par l'équipe d'experts du secteur de Secure Code Warrior, qui s'est engagée à donner aux développeurs les connaissances et les compétences nécessaires pour créer des logiciels sécurisés dès le départ. S'appuyant sur une expertise approfondie en matière de pratiques de codage sécurisé, de tendances du secteur et de connaissances du monde réel.

Teilen auf:
LinkedIn-MarkenSozialx Logo

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente 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 umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt 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 viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Check out how we help automotive and transportation industries. Or try un défi de codage axé sur l'intégration dès aujourd'hui pour découvrir comment nous donnons aux développeurs les moyens d'écrire des applications embarquées sécurisées !

Ressource anzeigen
Ressource anzeigen

Füllen Sie das untenstehende Formular aus, um den Bericht herunterzuladen.

Wir möchten Ihre Einwilligung einholen, um Ihnen Informationen zu unseren Produkten und/oder zu Themen im Zusammenhang mit sicherer Verschlüsselung zuzusenden. Wir werden Ihre personenbezogenen Daten stets mit größter Sorgfalt behandeln und niemals zu Marketingzwecken an andere Unternehmen verkaufen.

Einreichen
scw Erfolgssymbol
scw-Fehlersymbol
Um das Formular zu senden, aktivieren Sie bitte die „Analytics“-Cookies. Sie können diese nach Abschluss des Vorgangs wieder deaktivieren.

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente 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 umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt 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 viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Check out how we help automotive and transportation industries. Or try un défi de codage axé sur l'intégration dès aujourd'hui pour découvrir comment nous donnons aux développeurs les moyens d'écrire des applications embarquées sécurisées !

Webinar anzeigen
Beginnen Sie
mehr erfahren

Klicken Sie auf den untenstehenden Link und laden Sie das PDF dieser Ressource herunter.

Secure Code Warrior Ihr Unternehmen dabei, den Code während des gesamten Softwareentwicklungszyklus zu sichern und eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Ganz gleich, ob Sie für die Anwendungssicherheit verantwortlich sind, Entwickler, IT-Sicherheitsbeauftragter oder in einer anderen Funktion im Bereich Sicherheit tätig sind – wir können Ihrem Unternehmen dabei helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.

Bericht anzeigenDemo buchen
PDF herunterladen
Ressource anzeigen
Teilen auf:
LinkedIn-MarkenSozialx Logo
Möchten Sie mehr erfahren?

Teilen auf:
LinkedIn-MarkenSozialx Logo
Autor
Secure Code Warrior
Veröffentlicht Aug 11, 2021

Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.

Cet article a été rédigé par l'équipe d'experts du secteur de Secure Code Warrior, qui s'est engagée à donner aux développeurs les connaissances et les compétences nécessaires pour créer des logiciels sécurisés dès le départ. S'appuyant sur une expertise approfondie en matière de pratiques de codage sécurisé, de tendances du secteur et de connaissances du monde réel.

Teilen auf:
LinkedIn-MarkenSozialx Logo

Auf Secure Code Warrior sind wir stets bestrebt, unser Schulungsangebot zu erweitern. Um Entwicklern und Sicherheitsverantwortlichen die Möglichkeit zu geben, sichere eingebettete Systeme zu entwickeln, haben wir uns in die Welt der Sicherheit eingebetteter Systeme eingearbeitet. In diesem Beitrag stellen wir die wichtigsten Dinge vor, die Entwickler und Architekten über die Entwicklung sicherer eingebetteter Systeme wissen sollten. 

Ein eingebettetes Gerät ist eine unabhängige Recheneinheit mit eigener mikroprozessorbasierter Hardware und Software. Sie werden in der Regel zur Ausführung spezieller Funktionen verwendet, entweder unabhängig oder als Teil größerer Systeme.

Was ist ein eingebettetes Gerät und System?

Eingebettete Geräte sind zweckgebundene Computersysteme mit minimalistischer Hardware und Software, die für die Ausführung bestimmter Funktionen programmiert sind. Je nach ihrem Zweck können eingebettete Geräte unterschiedlich komplex sein. 

Wenn ein eingebettetes System komplizierte, ressourcenintensive Operationen durchführen muss, kann seine Hardware aus mehreren Prozessoren mit verschiedenen miteinander verbundenen Peripheriegeräten bestehen. Wenn es jedoch für eine einfache Aufgabe konzipiert ist, kann es auch nur einen einzigen Mikrocontroller enthalten. 

Einige eingebettete Systeme sind Blackboxes ohne Benutzeroberfläche, während andere detaillierte grafische Benutzeroberflächen haben können.

Beispiele für eingebettete Geräte

Eingebettete Geräte finden in zahlreichen Branchen Anwendung, von der Luft- und Raumfahrt bis zur Computerbranche und von Haushaltsgeräten bis zum Gesundheitswesen. Hier sind ein paar Beispiele:

  • Ein Thermostat in einem Klimagerät. 
  • Ein Fitness-Tracker mit kleinen elektrischen Bauteilen, auf denen ein winziges Betriebssystem läuft, das nicht mehr kann als Ihre Gesundheitsdaten aufzuzeichnen und zu synchronisieren.
  • Digitale Klimakontrollsysteme.
  • Navigationssysteme in Flugzeugen.
  • Digitale Uhren.
  • GPS-Geräte.
  • Wi-Fi-Komponenten in Mikrowellenherden und anderer Unterhaltungselektronik.
  • Blutdruck- und Herzschlagmessgeräte.
  • Vernetzungskomponente 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 umfasst ein eingebettetes Gerät die gesamte Software und Hardware, die es zur Ausführung seiner Funktionen benötigt. Ein Laptop verpackt in der Tat verschiedene Hardwarekomponenten in ein Metallgehäuse und umfasst die gesamte Software, die zur Bereitstellung seiner Funktionen erforderlich ist.

Im Gegensatz zu typischen eingebetteten Systemen, die einen vordefinierten, minimalen Funktionsumfang haben, ist ein Laptop jedoch universeller einsetzbar und kann für eine Vielzahl von Aktivitäten verwendet werden.

Eingebettete Geräte im Internet der Dinge

Eingebettete Systeme sind das Herzstück des IoT. Ihr intelligenter Kühlschrank kann dank eines eingebetteten Geräts über Ihr Mobilgerät gesteuert werden. Es ist ein eingebettetes Gerät in Ihrem Sicherheitssystem, mit dem Sie CCTV-Aufnahmen aus tausend Meilen Entfernung ansehen können. Und wenn Sie einen Knopf drücken, um Ihr Auto auf Autopilot zu stellen, ist es ein eingebettetes Gerät, das hinter den Kulissen die ganze Magie bewirkt.

Lebenszyklus der Entwicklung eingebetteter Software

Der typische Lebenszyklus der Softwareentwicklung eines eingebetteten Geräts umfasst die folgenden Schritte:

Schritt 1: Zweck und Anforderungen

Ein eingebettetes Gerät hat einen bestimmten und präzisen Funktionsumfang. Deshalb ist es sehr wichtig, seinen Zweck und seine Anforderungen vor Beginn der Entwicklung explizit zu formulieren. Es wird empfohlen, ein detailliertes Entwurfsdokument für das System zu erstellen. Beantworten Sie Fragen wie:

  • Welche Funktionen wird das Gerät erfüllen?
  • Wird sie ein Teil einer anderen Maschine sein, oder wird sie eigenständig funktionieren?
  • Soll das Gerät über eine Benutzeroberfläche verfügen? Wenn ja, reicht eine Befehlszeile aus, oder ist eine grafische Benutzeroberfläche erforderlich?
  • Welche Größen-, Kosten- oder Stromverbrauchsgrenzen muss das Gerät einhalten?
  • Gibt es Leistungsmaßstäbe? Wird z. B. erwartet, dass das Gerät in Echtzeit oder innerhalb bestimmter Schwellenwerte reagiert?

Schritt 2: Systemarchitektur

Sobald wir die einzigartigen Systemanforderungen ermittelt 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 viel Strom werden die Komponenten benötigen? 
  • Wird das Gerät mit dem Internet verbunden sein?
  • Welche Schnittstellen müssen hinzugefügt/entwickelt werden, damit das Gerät mit anderen Geräten oder der größeren Maschine verbunden werden kann?
  • Wie werden Sie die Verschlüsselung umsetzen? (denken Sie an Algorithmen, Schlüsselspeicherung usw.)
  • Wie werden Sie potenzielle Schwachstellen, Sicherheitslücken und Malware erkennen und vermeiden?

Schritt 3: Auswahl des Betriebssystems

Die Wahl des Betriebssystems entscheidet oft über die Effizienz Ihrer eingebetteten Anwendungen, also wählen Sie mit Bedacht. Windows für IoT kann bei der Grafik punkten, bietet aber keine Hardware-Unterstützung. Embedded Linux und Android sind kostenlos, während für VxWorks und Windows für IoT Lizenzkosten anfallen. 

Bei Open-Source-Systemen wie Linux und Android haben die Entwickler mehr Kontrolle über den Kernel; bei proprietären Systemen hingegen können Sie nur mit den Standardfunktionen des Kernels arbeiten. 

Es ist auch wichtig, bei der Auswahl eines Betriebssystems die Sicherheitsaspekte zu berücksichtigen. Werden Sicherheits-Patches schnell veröffentlicht, falls Sicherheitslücken entdeckt werden? Gibt es einen eingebauten Schutz gegen die häufigsten Angriffe auf die Cybersicherheit?

Schritt 4: Die Entwicklungswerkzeuge

Verschiedene Programmiersprachen und Frameworks haben verschiedene Vor- und Nachteile. Je nach Ihren Anforderungen an Funktionen, Geschwindigkeit und Zuverlässigkeit können Sie eine Sprache/ein Framework der anderen vorziehen. 

Wenn Ihre Anwendung webbasiert ist und Sie eine hohe Leistung wünschen, wählen Sie Java.
Wenn Sie jedoch den schnellsten Durchsatz wünschen, wählen Sie C/C++. Wenn Sie die beste Unterstützung für Bibliotheken von Drittanbietern wünschen, sollten Sie sich für Python entscheiden.

Schritt 5: Programmieren, überarbeiten, testen, weiterprogrammieren

Sobald Sie sich für eine Entwicklungsplattform entschieden haben, können Sie mit dem Programmieren beginnen. Denken Sie daran, dass eingebettete Systeme empfindliche Geräte mit begrenzten Hardware- und Softwareressourcen sind. Daher ist es von entscheidender Bedeutung, die besten Praktiken in Bezug auf Anwendungssicherheit und Leistung zu beachten.

Code-Reviews helfen bei der Optimierung des Codes und bei der Identifizierung potenzieller Bugs. Außerdem müssen Sie so rigoros wie möglich testen. Stellen Sie sicher, dass Sie eine erschöpfende Liste aller Testfälle zusammenstellen, auf die das Gerät beim Einsatz in der Produktion stoßen könnte.

Schritt 6: Wartung und Unterstützung

Wie bei jeder anderen Anwendung/jedem anderen Gerät endet der Lebenszyklus nicht, wenn das eingebettete Gerät ausgeliefert und installiert wurde. Während das Gerät in der Produktion eingesetzt wird, werden neue Anwendungsfälle identifiziert, die das Hinzufügen neuer Funktionen erfordern. Gemeldete Fehler können auch die Veröffentlichung neuer Firmware-Updates erforderlich machen.

Die wichtigsten eingebetteten Programmiersprachen

Es gibt viele seriöse Organisationen wie IEEE und TIOBE, die eine Rangliste der Programmiersprachen nach Beliebtheit und Verwendung erstellen. Unabhängig davon, ob Sie sich den TIOBE-Index oder das IEEE Spectrum ansehen, werden Sie jedoch ein gemeinsames Thema feststellen.

Die Top 3 Sprachen sind immer C, Python und Java. Im TIOBE-Index für Juli 2021 steht C auf Platz 1, Java auf Platz 2 und Python auf Platz 3. Laut IEEE Spectrum's Ranking für eingebettete Programmiersprachen lautet die Reihenfolge: Python, Java, und dann C.

Wie unterscheidet sich in Java, C oder Python geschriebene Firmware?

Verschiedene Sprachen verwalten den Speicher, die Interaktion mit dem Betriebssystem und die Laufzeit auf unterschiedliche Weise. Java-Anwendungen werden z. B. in einer speziellen Laufzeitumgebung ausgeführt, die als Java Virtual Machine (JVM) bekannt ist. 

Die Speicherverwaltung in C/C++ erfolgt manuell, während Sie sich in Java oder Python nicht selbst um die Speicherverwaltung kümmern müssen; die Sprache erledigt das für Sie. Hinzu kommt, dass Sie in C Ihren Müll selbst einsammeln müssen, d. h. wenn Sie einen Speicherbereich dynamisch zuweisen, müssen Sie ihn auch explizit wieder freigeben. Wenn Sie das nicht tun, führt das zu einem Speicherleck. In Java oder Python wird die Garbage Collection automatisch durchgeführt. Allerdings ist C von Natur aus viel schneller als Java oder Python.

Eine Sache, die C und Java (aber insbesondere C) im Vergleich zu Python fehlt, ist die Verfügbarkeit von Bibliotheken von Drittanbietern. Python verfügt über eine reichhaltigere Datenbank von Bibliotheken, die es Entwicklern viel einfacher macht, bestimmte Funktionen hinzuzufügen.

Insgesamt sollten Sie C wählen, wenn:

  • Sie wollen eine Low-Level-Schnittstelle mit dem Betriebssystem und der Hardware.
  • Sie wollen die bestmögliche Leistung.
  • Ihre Entwickler sind in C/C++ bewandert.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Verwenden Sie Python, wenn:

  • Sie möchten datenwissenschaftliche oder maschinelle Lernalgorithmen implementieren.
  • Sie möchten umfangreiche Unterstützung für Bibliotheken von Drittanbietern.
  • Sie sind damit einverstanden, Geschwindigkeit gegen Benutzerfreundlichkeit einzutauschen.
  • Sie haben nur begrenzte Erfahrung in der Embedded-Entwicklung.
  • Sie brauchen keine Low-Level-Schnittstelle mit dem Betriebssystem oder der Hardware.

Verwenden Sie Java, wenn:

  • Sie erstellen Webanwendungen.
  • Sie wollen eine einfachere Entwicklung als in C, aber dennoch mehr Leistung als in Python.
  • Sie brauchen nicht allzu viel Unterstützung von außen/von Dritten.

Wird C langsam aufhören, die erste Wahl für die Embedded-Entwicklung zu sein?

Hochsprachen erleichtern die Programmierung, indem sie die Komplexität, die sich in C einfach nicht vermeiden lässt, abstrahieren. Dennoch ist C trotz der Einführung neuer Sprachen und Frameworks seit Jahrzehnten die erste Wahl bei der Embedded-Entwicklung. 

Der Grund dafür ist, dass die Geschwindigkeit, Leistung und Zuverlässigkeit, die sie bietet, immer noch unerreicht sind. Die Tatsache, dass Python und große Teile des Java-Ökosystems (einschließlich der Laufzeitumgebung, der Sprache und des Compilers) in C geschrieben sind, spricht Bände über die Effizienz und Beständigkeit der Sprache.

Allerdings ist C für neue Entwickler, die die Einfachheit von Sprachen wie Python bevorzugen, unbestreitbar schwieriger zu erlernen. Dies führt zu einem spürbaren Rückgang der C-Entwicklergemeinde. Auch die zunehmende Entwicklung von KI- und ML-Anwendungen führt dazu, dass die Menschen Python gegenüber C bevorzugen, einfach weil es eine größere Bibliotheksunterstützung bietet.

Es ist wichtig, daran zu denken, dass Python erst seit kurzem Teil der Debatte um die wichtigste Programmiersprache für Embedded-Systeme ist. Ja, seine Akzeptanz wird in den kommenden Jahren weiter steigen, aber wir erwarten nicht, dass C jemals aufhören wird, die erste Wahl für die Embedded-Entwicklung zu sein.

Warum sichere Kodierung in C/C++ wichtig ist

Beim Schreiben von Code in C/C++ kann eine Menge schief gehen. Der Zugriff auf eine Speicheradresse, die nicht mehr auf gültige Daten verweist, oder die falsche gemeinsame Nutzung von Daten zwischen Threads kann zum Absturz Ihrer gesamten Anwendung führen. 

Bei eingebetteten Geräten sind diese Auswirkungen weitaus bedeutender, da ein Absturz in diesen Geräten dazu führen kann, dass eine viel größere Maschine nicht mehr funktioniert. Wenn z. B. das Autopilot-Modul in einem Auto ausfällt, kann das Auto Hindernissen nicht mehr ausweichen.

Hier sind weitere Gründe, warum die sichere Kodierung von C/C++-Anwendungen so wichtig ist:

  • Unsichere Speicherbehandlung (Nullzeiger, Speicherverfälschung, Stapelüberläufe, Puffer- und Heap-Überläufe) führen zum Absturz der gesamten Anwendung.
  • Zeiger sind ein fester Bestandteil von C und C++. Der Umgang mit ihnen erfordert äußerste Sorgfalt und tiefgreifende Kenntnisse der zugrunde liegenden Konzepte.
  • Die Speicherbereinigung erfolgt manuell. Daher müssen Programmierer jeden dynamisch zugewiesenen Speicher explizit löschen. Nicht freigegebener oder nicht korrekt freigegebener Speicher kann zu Speicherlecks oder -beschädigung führen.
  • Es fehlt an standardisierten APIs für fortgeschrittene Datenstrukturen (z. B. Hashtabellen, Mengen usw.), so dass die Entwickler gezwungen sind, das Rad neu zu erfinden.

Es ist absolut wichtig, dass Entwickler in der sicheren Programmierung von C/C++-Anwendungen geschult werden. Secure Code Warrior bietet eine personalisierte learning platform mit interaktiven Herausforderungen, courses und Bewertungen, die es Entwicklern ermöglichen, sicheren C/C++-Code zu schreiben. Hier geht es um sprachen- und rahmenspezifische Inhalte, nicht nur um eine Verbesserung der allgemeinen konzeptionellen Schulung.

Check out how we help automotive and transportation industries. Or try un défi de codage axé sur l'intégration dès aujourd'hui pour découvrir comment nous donnons aux développeurs les moyens d'écrire des applications embarquées sécurisées !

Inhaltsverzeichnis

PDF herunterladen
Ressource anzeigen
Möchten Sie mehr erfahren?

Secure Code Warrior fait du codage sécurisé une expérience positive et engageante pour les développeurs à mesure qu'ils améliorent leurs compétences. Nous guidons chaque codeur le long de son parcours d'apprentissage préféré, afin que les développeurs doués pour la sécurité deviennent les super-héros du quotidien de notre monde connecté.

mehr erfahren

Secure Code Warrior Ihr Unternehmen dabei, den Code während des gesamten Softwareentwicklungszyklus zu sichern und eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Ganz gleich, ob Sie für die Anwendungssicherheit verantwortlich sind, Entwickler, IT-Sicherheitsbeauftragter oder in einer anderen Funktion im Bereich Sicherheit tätig sind – wir können Ihrem Unternehmen dabei helfen, die mit unsicherem Code verbundenen Risiken zu reduzieren.

Demo buchenHerunterladen
Teilen auf:
LinkedIn-MarkenSozialx Logo
Ressourcenzentrum

Ressourcen, die Ihnen den Einstieg erleichtern

Weitere Beiträge
Ressourcenzentrum

Ressourcen, die Ihnen den Einstieg erleichtern

Weitere Beiträge