Vorlesungsnotizen Architektur Eingebetteter Systeme

Jonas Otto

Sommersemester 2020

Was ist ein Eingebettetes System

Aufgaben

Bitte beschreiben Sie kurz was ein eingebettetes System ist.

Ein eingebettetes System ist ein Rechnersystem, bei dem alle Komponenten hochintegriert und eng miteinander verbunden sind. Es wurden ja schon FPGAs erwähnt, ich denke da ist von einem eingebetteten System die Rede, wenn auf einem Chip sowohl ein Prozessorkern als auch diverse (evtl Applikationsspezifische) Peripherie untergebracht ist. Ein Eingebettetes System kann auch ein Microcontroller mit fest verbundenem Speicher und Peripherie sein.

Die charakteristischen Eigenschaft eines eingebetteten Systems ist die enge Verknüpfung eines Prozessors mit Peripherie, welche ein sehr Anwendungsspezifisches Computersystem realisiert.

Eingebettete Systeme bieten durch die enge Integration Vorteile wie Energieeffizienz und reduzierte Herstellungskosten, oder erhöhte Performance durch wegfallen von generischen Schnittstellen, bringen aber den Nachteil der geringeren Flexibilität (außer im oben genannten FPGA Beispiel z.B.).

Ein eingebettetes System kann aber auch ein klassischer PC sein, der z.B. durch besonders kleine Bauform in andere Anwendungen integriert ist, z.B. in industriellen Steuerungsanlagen oder Maschinen. Hier bezieht sich “eingebettet” auf den Kontext des Systems und nicht auf die einzelnen Rechnerkomponenten.

Vorlesungsnotizen

Zeitleiste

Definition

VHDL

Einführung

Motivation

VHDL - Very High Speed Hardware Description Language

Signale
Entity

Schnittstelle:

entity DECO is
  port (a,b,c: in bit;
        f    : out bit);
end DECO

Implementierung

architecture BEHAVIOR of DECO is
begin
  f <= ((not a) and b and c) or ...;
end BEHAVIOR;

Struktur

architecture STRUCTURE of DECO is
component AND
  port (a,b,c: in bit;
            f: out bit);
end component;

component OR
  port (a,b,c: in bit;
            f: out bit);
end component;

begin
  signal ia, ib: bit;
  signal ao1: bit;
  I1: INV port map(a, ia);
  A1: AND port map(ia,b,c,ao1);
  O:  OR port map(...
end

Komponenten

Komponenten sind entitys. Schnittstelle wird mit port spezifiziert. Port spezifiziert mehrere Eingänge in, an die Eingangssignale angeschlossen werden. Eingangssignale müssen spezifiziertem Typ (z.B. bit) entsprechen. Port spezifikation enthält auch Ausgänge out und Ein/Ausgänge inout.

entity Name is
  port (i1, i2, i3: in Bit;
        o1, o2:     out Bit;
        io1:        inout Bit
       );
end;

Komponenten können aus Unterkomponenten bestehen, die miteinander verbunden sind. Diese Unterkomponenten können aus einer Bibliothek kommen.

Bibliothek wird genutzt mit

LIBRARY IEEE;
USE ieee.std_logic_1164.all;

Der Inhalt einer Komponente wird spezifiziert mit der Anweisung architecture:

architecture behavior of Name is
Begin



End

Komponente kann mit Verhaltens- oder Strukturbeschreibung spezifiziert sein.

architecture structure of Name is
Begin

End;

Eine Entity kann aus mehreren Architekturen aufgebaut werden. Zuerst wird das Verhalten spezifiziert. Dieses Verhalten wird getestet, durch eine Testbench Entity. Dann kann die Komponente “gebaut” werden, also die Strukturbeschreibung.

Das Verhalten stellt die Spezifikation dar, die Struktur stellt die Implementierung dar.

configuration name of Entity is

end configuration

Verhalten

Das Konzept process kapselt algorithmisches Verhalten.

Beispiel Multiplexer:

MX: process (a,b,s)
Begin

  if s='1' then
    o<=a;
  else
    o<=b;
  endif;

end process;

Auch Schleifenkonstrukte wie for, while sind möglich.

Ein process spezifiziert beliebige Algorithmen.

Auch auf der Registertransferebene lässt sich Verhalten spezifizieren:

architecture...
begin

o<=a when s='1' else
   b

end...

Dies ist eine Datenflussbeschreibung.

Struktur

Spezifizieren einer Komponente aus Bibliothek:

component NAND
  port (
    a,b: in  bit;
    c:   out bit
  );
end component;

Aufrufen der Komponente:

nand1: NAND portmap(t, s, o)
                   (a=>t, b=>s, c=>o)

Datentypen

IEEE

Userdefiniert

type int0 is range 0 to 100;
type int1 is range -100 to 1000;

Subtypes

“Vererbung”:

subtype int5 is Integer range -5 to 5;

Aufzählungen

type state is (locked, unlocked, ...);

Komplexere Datentypen

4-bit breiter Bus:

type BUS is array(0 to 3) of bit;

Äquivalent zu c-struct:

type INTERFACE is record
  bus: BUS;
  ctrl: BIT;
  date: BUS;
end record;

Simulationssemantik

In der Realität treten Effekte wie Verzögerungszeiten auf. Diese können modelliert werden:

x <= Not In after 10ns
x <= Regejt 10ns Inertial Not In after 10ns
x <= Reject 0ns Inertial Not In after 10ns
x <= Transport Not In after 10ns

Diese Konstrukte können nur für die Modellierung, nicht bei der Synthetisierung verwendet werden.

Die Transaktionsliste gibt die Zustände aller Signale zu jedem Zeitschritt an. Dabei werden Verzögerungen für jedes Gatter angenommen.

Bei sequentiellen Schaltungen werden zum Auflösen von Rückkopplungen künstliche Zeitschritte mit “delta-Zeitschritten” angegeben.

Architektur der Komponenten

Instruction Set Processor ISP

Application Specific Instructionset Processor ASIP

Application Specific Processor ASP

Logic Fabrics

Entwurfsprozess

Synthese digitaler Schaltungen

Chip Technologie

Full-Custom-Entwurf

ASIC Entwurf

Standardzellenentwurf

Gate Array

Sea of Gates

Zusammenfassung

FPGAs

Field Programmable Gate Array * Zusammengesetzt aus Arraystrukturen * In Arrayelementen befindet sich programmierbare Schaltung * n -> 1 Auswahllogik, Speicher realisiert LUT

Sensoren und Aktoren I

Beispiel Flugzeug: * Sensoren * ADC * Eingebetteter Computer * DAC * Aktoren

Sensoren

Aktoren

Bauteile

Operationsverstärker

Komparator

Verstärkerschaltungen

Brückenschaltung

Sensoren und Aktoren II

Komparator

Fensterkomparator

Sensor zur Geschwindigkeitsmessung

Drehratensensor

Radar

Sonar

Aktoren

Anschluss von Sensoren

ADC/DAC

Abtasttheorem

DAC - Digital-Analog-Umsetzer

Parallele Verfahren

Wägeverfahren

  1. Leiternetzwerk:

Zählverfahren

ADC

Parallele Verfahren

“Word at a time”

Wägeverfahren

“Digit at a time”

Zählverfahren

“Level at a time”

  1. Sägezahnumsetzer
  2. Dual Slope

Delta-Sigma

Programmierung eingebetteter Systeme

Programmieren von Treibern in C

Architektur

C-Programm

sSlaveDev struct {
  uint8_t status;
  uint8_t control;
  uint8_t tx;
  uint8_t rx;
}
#define STS_NOP_TX 0xF0
#define STS_NOP_RX 0x0F
#define STS_FULL_TX 0xF0
#define STS_EMPTY_TX 0x00
#define SUCCESS 0
#define FAIL 1

(NOP = “Number Of Packets”)

const int size = 100;
uint8_t rxBuf[size];
uint8_t txBuf[size];
sSlaveDev *devPtr = 0x8000;
int put(sSlaveDev *dev, uint8_t *txBuf){
  if (dev->status < STS_FULL_TX) {
    def->tx = txBuf;
    return SUCCESS;
  } else {
    return FAIL;
  }
}

usw (put, write, read) , kann man sich ja vorstellen oder auch lieber nicht.

Unterbrechungen

Damit man nicht pollen muss, sollte das I/O Gerät sich melden, sobald es z.B. Daten empfangen hat.

Architektur

C

void isr0(){
  iodev->ctrl = ...;
  status = iodev->status;
  ...
}
void main(){
  initInterruptHandler(&isr0, 0); // Initialisiert oben erwähnte Tabelle
  ...
}

Dies nennt man auch Foreground/Background System: Main-Loop im Hintergrund, Interrupts im Vordergrund.

Programmieren von Treibern in ADA

Mangels Motivation und aufgrund von Unwillen, die Software des Eurofighters näher zu betrachten, bleibt dieser Abschnitt leer.

EA Architekturen

  1. I2C
  1. +DMA

Echtzeitsysteme

Beispiel: Steuercomputer eines Flugzeugs

Diese Sensordaten werden teils direkt auf Instrumente geführt, aber im Allgemeinen auf einen gemeinsamen Systembus geführt. Auf diesen Systembus werden auch die Nutzereingabe von z.B Steuerknüppel und Pedalen geführt.

Ein Zustandsregler erzeugt daraus Steuerdignale, die mittels D/A Wandler an Triebwerke und Klappen geführt werden.

Man stellt fest, dass hier viele voneinander unabhängige Operationen spezifiziert wurden. Diese nennen wir Tasks, die ständig voneinander unabhängig laufen.

Eine Anforderung an das Gesamtsystem ist, dass die gesamte Zeit von Eingang zum Ausgang begrenzt ist. Diese Begrenzung ergibt sich aus der Dynamik des Physikalischen systems, ein Überschreiten kann zur Instabilität führen.

Die Dynamik des Flugzeugs beeinflusst das Zeitverhalten des Rechensystems.

Der Rechner muss also so schnell wie nötig sein, allerdings wirken andere Anforderungen wie Größe und Kosten dem entgegen.

Ein solcher Rechner heißt Echtzeitsystem.

Zeit und Echtzeitsysteme

Ein Programm in einem Rechner läuft i.A. sequentiell ab. Diese Ausführung wird von einem Takt vorgegeben. Hier wird von Logischer Zeit gesprochen. Bei einer Logischen Uhr wird nur gefordert, dass die Ursache eines Ereignisses vor dessen Wirkung stattfindet.

In der reellen Welt wird durch die Zeit z.B. eine Bewegung beschrieben. Zur Messung der Zeit benötigen wir eine Uhr, die z.B. auf einer periodischen Bewegung basieren.

Ein Ereignis (in der VL dargestellt durch einen Blitz ⚡) ist ein zeitloser Zustandswechsel.

Die echte Zeit nennen wir Realzeit oder Echtzeit. Diese läuft unabhängig von den Vorgängen im Rechner.

Innerhalb unseres Rechners (zwischen A/D und D/A) herrscht die Logische Zeit. Wir definieren eine Frist, in der die Berechnung abgeschlossen sein muss.

Echtzeitssystem

Ein einegebetter Rechner, der durch externe Ereignisse ausgelöste Berechnungnen rechtzeitig ausführt. Das beinhaltet sowohl das Bereitstellen von Ergebnissen zu festen, vorgegebenen Zeitpunken als auch die rechtzeitige Fertigstellung von Berechnungen.

Diese Rechtzeitigkeit ist vorgegeben durch die Reale Zeit, nicht die Logische Zeit im Rechner.

Wir unterscheiden zwischen harten und weichen Echtzeitsystemen.

Harte Echtzeitsysteme

Keine Echtzeitverletzung wird toleriert.

Beispiele:

Weiche Echtzeitsysteme

Kostenfunktion für Berechnungsdauer fällt langsam, flach ab. Rechnungen, die das Zeitlimit überschreiten sind nicht immer problematisch.

Beispiele:

Nebenläufigkeit in Echtzeitsystemen

Wir erinnern uns daran, dass wir viele zeitlich unabhängige Abläufe spezifiziert haben. Das Ausführungsmodell der Tasks ist Nebenläufig.

Es soll eine scheinbare Nebenläufigkeit auf einem sequentiellen Prozessor implementiert werden.

Ein Ablaufplan legt die Ausführungsreihenfolge der Aufgaben fest. Dieser kann fest einprogrammiert sein, oder durch Regeln spezifiziert sein. Ersteres nennt man ein statisches, zweiteres ein dynamisches Echtzeitsystem.

Ein dynamisches System können Aufgaben unterbrechbar (preemptive) sein, so kann flexibel auf externe Ereignisse reagiert werden.

Es muss eine Ablaufreihenfolge festgelegt werden. Dafür werden den Aufgaben Prioritäten zugewiesen, die wiederum statisch oder dynamisch sein können.

Ausführungsmodelle

Wie synchronisieren wir den Rechenablauf mit der externen Zeit*

Physical execution time programming PET

Logical execution time programming LET

Zero execution time programming ZET

Bei LET und ZET können statische Ablaufpläne erstellt werden.

Bounded execution time programming BET

Ausführungsplan des scheinbar nebenläufigen Systems ist vorhersehbar!

RTOS

Nebenläufigkeitsmodelle werden durch einen Scheduler implementiert. Zwischen Tasks und ISA liegt ein OS oder RTOS.

Ein RTOS hat die Eigenschaften:

Echtzeitbetriebssysteme

Aufgaben eines RTOS

Kernel Implementierung eines RTOS

Ziel ist Unterstützung von nested Interrupts. Nach der ISR kann der Scheduler aufgerufen werden. Nach dem Scheduler wird der Dispatcher aufgerufen, welcher feststellt, welcher Task als nächstes ausgeführt werden soll.

Besonders in Echtzeitbetriebssystemen kann ein Task einen zusätzlichen Zustand “Zombie” annehmen, welcher z.B. angenommen wird, wenn der Task Fristen (Echtzeitbedingung) nicht einhält.

Echtzeitkernel

Mit statischen Prioritäten: * Mehrere Ready Lists (für jede Priorität) * Komische redundante Datenstruktur (Bitmap) zum cachen der belegten Einträge

IPC mit Mailboxen für jede PID und Ringbuffer