Kooperative Signalverarbeitung in Embedded-Systemen Bitte 8 Bit!

Obwohl es mittlerweile Mikrocontroller auf der Basis von 16-, 32- und sogar 64-Bit-Architekturen gibt, spielt die 8-Bit-Architektur in Embedded-Systemen weiterhin eine wichtige Rolle. Es steckt also mehr in ihr, als auf den ersten Blick zu sehen ist.

Bild: iStock, Cranach
30.04.2019

Der Schein trügt: Obwohl es heute wesentlich rechenkräftigere Prozessortypen gibt, bleiben 8-Bit-Mikrocontroller nach wie vor eine gute Wahl. Vor allem in Systemarchitekturen, bei denen die Arbeitslast auf mehrere Prozessoren verteilt wird, punkten sie durch ihre Kosteneffektivität und Energieeffizienz.

Der erste 8-Bit-Mikrocontroller kam vor etwas mehr als 40 Jahren auf den Markt – und überzeugte Entwickler schnell von seinen Vorteilen. Als Einzelbaustein mit vollwertigem Mikroprozessor und Speicher, einem Timer sowie I/O-Ports bot er erhebliches Einsparpotenzial bei den Stücklistenkosten und vereinfachte das Design vieler Elektronikprodukte.

In den folgenden Jahrzehnten sollten zahlreiche daraus abgeleitete Konkurrenzprodukte in die unterschiedlichen Embedded-Systeme vordringen. Obwohl die Hersteller von Mikrocontrollern seitdem Bausteine auf der Basis von 16-, 32- und sogar 64-Bit-Architekturen vorgestellt haben, spielt die 8-Bit-Architektur in Embedded-Systemen weiterhin eine wichtige Rolle.

8-Bit-Mikrocontroller findet man aktuell in sehr verschiedenen Anwendungen. Oft sind sie der einzige softwareprogrammierte Baustein im System, beispielsweise in Rauchmeldern oder industriellen Sensormodulen. Häufig kommen ein oder mehrere 8-Bit-Mikrocontroller auch parallel zu anderen, auf 16-, 32- oder 64-Bit-Architekturen beruhenden Prozessoren zum Einsatz. Ein einfaches Beispiel dafür ist der Tastaturcontroller, der dem Host-Prozessor des Computers im besten Fall die Arbeit wesentlich erleichtert. In vielen Fällen wird durch den Einsatz mehrerer kooperierender Prozessoren die Leistung des Gesamtsystems erheblich verbessert.

Arbeitslast bestmöglich verteilen

Beim Erstellen neuer Produktkonzepte, deren Steuerung auf Embedded-Prozessoren basiert, ist stets zu überlegen, wie man die Arbeitslast am besten auf die verfügbaren Ressourcen aufteilt. Die entscheidenden Kriterien dafür sind Kosteneffektivität und Energieeffizienz. Aus Hardware-Sicht scheint die Nutzung eines Betriebssystems das einfachste Vorgehen zu sein, um viele unterschiedliche Tasks nebeneinander auf einem Hochleistungsprozessor laufen zu lassen.

Dieses Vorgehen bietet allerdings nicht immer die beste Energieeffizienz, da der Datenaustausch zwischen dem System und seinen Ein- und Ausgängen oft mit einer sehr viel geringeren Datenrate erfolgt als der Spitzendurchsatz eines High-End-Prozessors. Entsprechend muss ein 32- oder 64-Bit-Prozessor mit einer Taktfrequenz von 1 GHz bei der Ausführung von I/O-Transaktionen viele Zyklen lang auf das Eintreffen eines neuen Bytes warten.

Mithilfe von Interrupts könnte man zwar ein ständiges Abfragen von Daten vermeiden. Nach jedem Interrupt müsste man jedoch im Fall eines Kontext-Switch Datenwerte im System-Stack ablegen beziehungsweise abfragen, was viele Overhead-Taktzyklen erfordert.

Meist nur kurze Aktivitätsphasen

Viele Embedded-Systeme werden durch Interrupts aus externen Ereignissen angesteuert. Diese Systeme warten auf irgendein Signal aus einer externen Aktivität, bevor sie mit der Verarbeitung von Eingangssignalen beginnen. Ein gutes Beispiel dafür ist wieder der Tastaturcontroller: Anstatt ständig Eingänge abzufragen, wartet er einfach darauf, dass ein elektrischer Kontakt geschlossen wird. Ein Interrupt-Controller erfasst den daraus resultierenden Puls, wodurch die Mikroprozessor-Firmware erkennt, dass sie die Tastaturleitungen abfragen und die jeweils gedrückte Taste ermitteln muss. Anschließend muss sie dem Host-Computer mitteilen, welchem Zeichen diese Taste entspricht.

Auch viele typische IoT-Systeme verarbeiten die meiste Zeit nur sehr wenige Daten – der Großteil ihrer Funktionen ist nur während kurzer Aktivitätsphasen erforderlich. Beispielsweise muss ein intelligenter Lautsprecher nur dann mit der Erkennung menschlicher Sprache beginnen, wenn das Mikrofon ein ausreichend starkes Audiosignal im richtigen Frequenzbereich erfasst. Auch ein Rauchmelder muss die in seine Kammer eingedrungene Luft nicht alle paar Mikrosekunden analysieren, da die Luftzirkulation ein recht langsames Phänomen ist. Vielmehr reicht es, wenn der Rauchmelder mit einer Abtastrate von weniger als 1 Hz prüft, ob die aktuelle Luftqualität eine eingehendere Analyse erforderlich macht. Die dafür nötigen Berechnungen dauern selbst bei Prozessorkernen mit einer Taktrate im niedrigen MHz-Bereich meist nur den Bruchteil einer Sekunde.

Low-Power-Schlafmodus spart Energie

Läuft der Prozessor zwischen den Messungen in einer Leerlaufschleife weiter, so wird sowohl beim Lautsprecher als auch beim Rauchmelder wertvolle Energie vergeudet. Die Lösung: Man versetzt den Prozessorkern zu Beginn der Leerlaufschleife in einen Low-Power-Schlafmodus und weckt ihn erst auf, wenn ein Interrupt von einem Systemtakt beziehungsweise Zähler eingeht oder wenn mittels einer ereignisgesteuerten Peripherieschaltung eine externe Aktivität erkannt wurde.

Um eine hohe Leistung zu gewährleisten, verwenden High-End-Prozessoren einen lokalen SRAM-Cache, in dem häufig benötigte Instruktionen und Daten abgelegt sind. Falls solch ein Cache nicht verfügbar ist, muss man den Code aus einem relativ langsamen Flash-Speicher in den SRAM- beziehungsweise DRAM-Speicher kopieren, um einen ähnlich guten Durchsatz wie bei einem Cache-Speicher zu erzielen.

Während des Sleep-Modus verlieren diese Speicherbausteine jedoch ihren Inhalt, um Energie zu sparen. Entsprechend müssen sie nach jedem Wakeup-Signal wieder aufgefrischt werden, bevor der Prozessor mit der Ausführung beginnen kann – ein sehr energieraubender Zwischenschritt, der mit zusätzlichen Latenzzeiten verbunden ist.

Gute Anpassung an nicht-flüchtige Speicher

Die meisten 8-Bit-Prozessoren sind wesentlich besser an die Leistung und die Fähigkeiten nicht-flüchtiger Speicher angepasst. Sie laden die Befehle direkt aus dem Flash-Speicher. Oft ist in ihnen ebenfalls ein nicht-flüchtiger Datenspeicher zur Speicherung von Daten zwischen Wakeup-Zyklen enthalten. Daher müssen sie ihre SRAM-Scratchpads nur selten neu laden. Die Folge davon ist ein Prozessorkern, der besser auf externe Ereignisse reagiert, obwohl er einen geringeren Spitzendurchsatz für Berechnungen bietet. Vor diesem Hintergrund ist verständlich, warum Systementwickler in komplexeren Systemen oft 8-Bit-Mikrocontroller neben den 16-, 32- oder 64-Bit-Prozessoren einplanen.

Beispielsweise kann man in einem intelligenten Lautsprecher einen 8-Bit-Mikrocontroller zur Verarbeitung der Audio-Eingangssignale nutzen, solange keine Sprachverarbeitung erforderlich ist: Der Mikrocontroller kann mithilfe von einfachen Algorithmen prüfen, ob das eingehende Tonsignal oberhalb des Hintergrundpegels liegt und, falls dem der Fall ist, ob es sich dabei um Rauschen oder um menschliche Sprache handelt. Nur wenn das Signal wichtig genug erscheint, weckt er den Hauptprozessor für weitere Analysen auf.

Core-unabhängige Peripherieschaltung

Die Architektur für eine kooperative Signalverarbeitung reicht jedoch weit über den Prozessorkern hinaus. In vielen Situationen ist die Flexibilität einer softwarebasierten Verarbeitung der vom System erkannten Ereignisse überhaupt nicht vonnöten.

Beispielsweise muss der Prozessor in einem intelligenten Lautsprecher nicht ermitteln, ob das eingehende Tonsignal Sprachmerkmale aufweist, solange das Mikrofon nur Hintergrundgeräusche mit niedrigem Pegel erfasst. Zu diesem Zweck werden Core-unabhängige Peripherieschaltungen (Core Independent Peripherals – CIP) eingesetzt, die Funktionen wie etwa den Vergleich eines Analog-Eingangssignals mit Referenzpegeln unabhängig vom Prozessorkern durchführen können. Erst wenn die Amplitude des vom Mikrofon aufgenommenen Signals eine durch einen Komparator ausgewertete Schwelle überschreitet, wird der Prozessor aufgeweckt.

Abhängig vom verwendeten Mikrocontroller bieten CIPs eine Reihe von konfigurierbaren Peripherieschaltungen. In ihnen sind kombinatorische Logik, Zustands- und Taktgeberfunktionen implementiert, die sich zur Realisierung verschiedenster Funktionen ohne eine direkte Intervention des Prozessorkerns miteinander kombinieren lassen – beispielsweise für eine Motorsteuerung, eine Stromversorgungs-Sequenzierung, Datenmodulationen oder eine konditionelle Signalabgabe. Bei Bausteinen wie dem ATmega4809 mit konfigurierbaren kundenspezifischen Logik-Controllern (Configurable Custom Logic – CCL) lassen sich die auf dem Chip integrierten A/D-Wandler mit programmierbaren Triggern und anderen zustandsgesteuerten Funktionen ausstatten, um den Prozessorkern von zusätzlichen Aufgaben zu entlasten.

Hardwarebasierte Filterung

Beim ADC2-Modul, das in zahlreichen 8-Bit-Mikrocontrollern wie zum Beispiel dem PIC16F18446 von Microchip enthalten ist, kann die Hardware Signalverarbeitungsfunktionen wie Averaging oder eine Tiefpassfilterung an digitalen Signalen ausführen. Dadurch wird verhindert, dass das System auf kurzfristige Störungen oder hörbare Nadelpulse reagiert.

Darüber hinaus ist eine Vorverarbeitung möglich, wenn das vom A/D-Wandler empfangene Signal auf Sprachgehalt hin untersucht werden soll. Eine ebenfalls im ADC2-Modul integrierte Hardwarefunktion vereinfacht das kapazitive Abtasten in Touch-Panels – eine Anwendung, die sich über Software nur sehr aufwändig implementieren lässt.

Die Unterstützung von hardwarebasierter Filterung bei Geräten mit einem ADC2-Modul ermöglicht den Einsatz von 8-Bit-Mikrocontrollern, wo bisher ein 16-Bit-Baustein die sinnvollste Wahl war. Bei den typischen Auflösungen für industrielle und Audio-Abtastwerte wäre bei einer 8-Bit-Pipeline zwar im Gegensatz zu einer 16-Bit-Architektur eine Aufspaltung der Abtastraten für die softwarebasierte Verarbeitung nötig – dank der hardwarebasierten Filterfunktionen entfällt jedoch ein Großteil der Signalverarbeitung für den 8-Bit-Prozessorkern, der sich nun voll auf seine Kernaufgaben der Systemverwaltung und -steuerung konzentrieren kann. Dieser vergrößerte Spielraum bei der Rechenkapazität macht es möglich, kostengünstigere 8-Bit-Bausteine für einfachere Endgeräte zu spezifizieren.

8-Bit für I/O-zentrierte Anwendungen

Auf 8-Bit-Architekturen beruhende Mikrocontroller eignen sich noch in einer weiteren Hinsicht besser für I/O-zentrierte, ereignisgesteuerte Anwendungen: Viele digitale I/O-Aufgaben operieren auf Bit- oder Sub-Byte-Ebene. Prozessoren mit größeren Wortbreiten sind oft nicht besonders effizient bei der Handhabung dieser Datentypen, da ganze Datenworte in den Registern verschoben und komplexe Bit-Masken zur Verarbeitung der richtigen Inhalte verwendet werden müssen.

8-Bit-Mikrocontroller hingegen bieten genau den richtigen Funktionsumfang für Anwendungen, bei denen zwischen den einzelnen Schritten nicht viele Berechnungen durchgeführt werden müssen. Bei I/O-zentrierten Aufgaben nutzen 8-Bit-Mikrocontroller den Programm- und Datenspeicher in der Regel effizienter als höherwertige Prozessoren.

Für jede Entwicklergeneration angepasst

8-Bit-Architekturen sind seit Jahrzehnten erfolgreich. Man könnte also annehmen, dass sich ihr Design nicht verändert habe. Doch 8-Bit-Mikrocontroller haben sich bestens an die Anforderungen jeder neuen Entwicklergeneration angepasst und bieten zusätzliche Funktionen wie intelligente Peripherieschaltungen oder eine Unterstützung für Hochsprachen, wie sie für eine moderne kooperative Verarbeitung nötig sind.

Natürlich erhöht eine kooperative Verarbeitung die Designkomplexität, da Entwickler die Synchronisierung zwischen mehreren Prozessorkernen und intelligenten Peripherieschaltungen berücksichtigen müssen. Doch Werkzeuge wie der MPLAB Code Configurator (MCC) von Microchip übernehmen die nötigen Verwaltungsaufgaben auf der Firmware-Ebene und ermöglichen Lösungen, die sich für verschiedenste Anwendungsformen wie Konnektivität, Motorsteuerung oder Energiemanagement eignen.

Bildergalerie

  • Core-unabhängige Peripherieschaltungen werden eingesetzt, um den Prozessorkern zu entlasten.

    Core-unabhängige Peripherieschaltungen werden eingesetzt, um den Prozessorkern zu entlasten.

    Bild: Microchip

  • Der 8-Bit-Mikrocontroller PIC16F18446 kann einfache Signalverarbeitungsfunktionen wie Averaging oder eine Tiefpassfilterung ausführen.

    Der 8-Bit-Mikrocontroller PIC16F18446 kann einfache Signalverarbeitungsfunktionen wie Averaging oder eine Tiefpassfilterung ausführen.

    Bild: Microchip

  • Der MPLAB Code Configurator nimmt dem Entwickler lästige Verwaltungsaufgaben ab und ermöglicht Lösungen unter Verwendung von 8-Bit-Mikrocontrollern.

    Der MPLAB Code Configurator nimmt dem Entwickler lästige Verwaltungsaufgaben ab und ermöglicht Lösungen unter Verwendung von 8-Bit-Mikrocontrollern.

    Bild: Microchip

Firmen zu diesem Artikel
Verwandte Artikel