Betriebssysteme
Eingebettete Systeme benötigen oft kein vollständiges Betriebssystem. Einige verwenden speziell gebaute kleine und einfache Betriebssysteme, die sehr schnell starten, andere benötigen überhaupt kein Betriebssystem. Eingebettete Systeme sind nicht so leicht anzupassen, aber sie sind so gebaut, dass sie ihre Aufgaben viel zuverlässiger erfüllen. Da die Hardware einfacher ist, ist sie oft auch billiger zu bauen und läuft schneller.
Im Gegensatz dazu muss ein Allzweck-Computer für neue Gerätetreiber und Software bereit sein, um Hardware ausführen zu können, die er noch nicht kennt, wie neue Drucker oder Festplatten. Er muss verschiedene Anwendungsprogramme ausführen können.
Da eingebettete Systeme immer größer werden, werden Dinge, die früher nur auf Allzweckrechnern oder sogar auf Großrechnern zu finden waren, nun auch auf eingebetteten Systemen üblich. Dazu gehören geschützter Speicherplatz und eine offene Programmierumgebung einschließlich Linux, NetBSD usw.
Einige Beispiele für Betriebssysteme, von einfach bis komplex:
- Einfache Regelschleife - Ein Timer und eine Schleife werden verwendet, um verschiedene Unterprogramme wiederholt aufzurufen. Bei kleineren Systemen wird dies oft von einer Person durchgeführt.
- interruptgesteuert - Die Aufgaben werden durch verschiedene Arten von Ereignissen gestartet. Das Ereignis könnte etwas zeitgesteuert sein (z.B. alle zehn Sekunden) oder durch einen Knopfdruck oder durch empfangene Daten.
- Nicht präemptives Multitasking - Jeder Task kommt an die Reihe, und wenn er beendet ist, ruft er einen Scheduler im Betriebssystem auf, um den nächsten Task auszuführen.
- präemptives Multitasking oder Multithreading - Ein Task kann nach einer gewissen Zeit angehalten werden, um einen anderen Task eine Weile laufen zu lassen. Kein Task kann das System überlasten. Auf dieser Ebene wird davon ausgegangen, dass das System über einen "Betriebssystem"-Kernel verfügt und Tasks parallel ausführen kann. Diese Art von Betriebssystem wird normalerweise von einer Firma gekauft, die nur mit eingebetteten Betriebssystemen arbeitet.
Zu den Echtzeitbetriebssystemen gehören Produkte wie MicroC/OS-II, Green Hills INTEGRITY, QNX oder VxWorks. Im Gegensatz zu MacOS oder Windows 7 sind diese Betriebssysteme den meisten Menschen nicht sehr gut bekannt. Aber sie werden an vielen Orten eingesetzt, wo Zeit und Sicherheit sehr wichtig sind. Die Menschen benutzen sie täglich und merken es nicht.
Gängige Beispiele für größere Kernel sind Embedded Linux und Windows CE. Obwohl diese nicht über die engen Zeitgrenzen verfügen, die für ein strenges Echtzeitsystem erforderlich sind, werden sie immer häufiger eingesetzt, insbesondere für leistungsfähigere Geräte wie Wireless Router und GPS. Sie ermöglichen die Wiederverwendung von Code im öffentlichen Bereich für Gerätetreiber, Webserver, Firewalls und anderen Code. Softwareentwickler, die bequemer Anwendungen für PCs schreiben können, werden dies auch vertrauter finden. Falls erforderlich, kann ein FPGA oder andere spezielle Hardware für Dinge verwendet werden, die enge Zeitbeschränkungen erfordern.
Werkzeuge
Wie andere Software verwenden Designer eingebetteter Systeme Compiler, Assembler und Debugger, um Software für eingebettete Systeme zu entwickeln. Sie können jedoch auch einige spezifischere Werkzeuge verwenden:
- Für Systeme, die digitale Signalverarbeitung verwenden, können Entwickler ein Mathematikwerkzeug wie MATLAB, MathCad oder Mathematica verwenden.
- Kundenspezifische Compiler und Linker können verwendet werden, um die Optimierung für die jeweilige Hardware zu verbessern.
- Ein eingebettetes System kann seine eigene spezielle Sprache oder sein eigenes Designwerkzeug haben oder Erweiterungen zu einer bestehenden Sprache hinzufügen, wie sie von Basic Stamp verwendet wird.
Debugging-Werkzeuge:
- Ein In-Circuit-Debugger (ICD), ein Hardware-Gerät, das über eine JTAG-Schnittstelle mit dem Mikroprozessor verbunden ist. Dadurch wird der Mikroprozessor von außen gestartet und gestoppt, während er die Software ausführt. Er ermöglicht auch das Auslesen von Speicher und Registern sowie das Speichern des Softwareprogramms im Speicher.
- Externes Debugging mittels Protokollierung oder Ausgabe über die serielle Schnittstelle, um den Betrieb mit einem blinkenden Monitor (printfs) nachzuvollziehen.
- Interaktives residentes Debugging - wenn das Betriebssystem dies unterstützt, handelt es sich um eine Shell auf dem eingebetteten Prozessor, die vom Entwickler eingegebene Befehle ausführt (z.B. Linux).
- Ein In-Circuit-Emulator ersetzt den Mikroprozessor auf der Platine und bietet volle Kontrolle über alles, was der Mikroprozessor tun könnte.
- Ein vollständiger Emulator simuliert alle Funktionen der Hardware, so dass die gesamte Hardware gesteuert und modifiziert werden kann. Die Hardware existiert nicht wirklich, aber eine vorgetäuschte Version davon (eine "virtuelle" Maschine) befindet sich auf einem normalen PC.
- Überprüfung der externen Leitungen mit einem Logikanalysator oder Multimeter.
Sofern er nicht auf externes Debugging beschränkt ist, kann der Programmierer in der Regel Software über die Tools laden und ausführen, den im Prozessor laufenden Code einsehen und seinen Betrieb starten oder stoppen. Die Ansicht des Codes kann als Assemblercode oder als Quellcode erfolgen. Einige integrierte Systeme (wie z.B. VxWorks oder Green Hills) verfügen über spezielle Funktionen, wie z.B. das Verfolgen, wie viel Platz die Software beim Ausführen benötigt, welche Aufgaben laufen und wann Dinge geschehen.
Je nachdem, welche Art von eingebettetem System hergestellt wird, hängt es davon ab, wie es debuggt werden kann. Beispielsweise unterscheidet sich das Debuggen eines einzelnen Mikroprozessorsystems vom Debuggen eines Systems, bei dem die Verarbeitung auch auf einem Peripheriegerät (DSP, FPGA, Co-Prozessor) erfolgt.