Der Asynchrone Interrupt
Wenn wir etwas in den Speicher schreiben wo eigentlich kein Speicher ist, wird ein Abort-interrupt ausgeführt
svc befehl
Interrupt Vektor Tabelle → Sprungzieladresse der Routinen die anzuspringen sind, wenn ein Interrupt ausgeführt ist
reset befehl ist auch ein Interrupt
Manchmal wird auch zwischen Hardware und Software Interrupts auslöst
Asynchron → ohne bezig zur Ablaufstruktur
VGL Seite 14 Skript
Das System startet im Supervisor Modus mit reset Befehl → höchste Priorität
Deeply Embedded Bereich
Hier gibt es keine verschiedene Prozesse und keine virtuelle Speicherverwaltung Nicht wie in einem Computer wo wir den File explorer, etc starten können
Es gibt im kritische Anwendungsbereiche für Embedded Systems
Interrupts können auch gesperrt werden → Durch eine Bitmaske : 0 oder 1 Interrupt → Interrupt Service Routine → Interruot tut was er muss
Mit dem sperren der Interrupts sperren wir die Reaktivität des Systems Für Motor Zündungen sind diese esentiell
Interrupt ausgelöst : Welche der Peripherien hat den Interrupt ausgelöst ?
Empfehlung : Prioritisierungs schema während der Laufzeit nicht zu ändern Mit Interrupts zu Programmieren ist es einfacher als mit Echtzeitsystemen Hierbei wird nämlich ein Interrupt Stack erstellt Eine Interrupt Service Routine darf nie blockiert werden
Wir können die ISR nicht pausieren, andere Interrupts können diese allerdings blockieren
yield suspend - Befehle
Wenn die ISR blockiert wird, ist das unterbrochene Programm unterbrochen ISR sollten kurz und klein woei kompakt sein
QUATIX , CORTEX ? M32 ; M… haben den gleichen Interrupt Controller
MMU
der ARM7 hat keine MMU-Memmory management Unit
In Systemen ohne MMU oder bei einem ungültigen Instruktionswort ist die zugehörige Unterbrechung lediglich das Symptom eines vorangegengen, sehr schwerwiegenden Software-Bugs
Das bedeutet für uns : wir benutzen Assertions , da diese uns weiterhelfen
Wenn das Sytem dauernd die ISR ausführt, ohne sie kommt nie mehr : Nachschauen ob mal beim letzten Mal die ISR richtig beendet hat
'Memo Map IO ?' -> peripherieregister, mit dem wir ein D FLIP FLOP connecten können, eine Leuchtdiode, Q Ausgang des DFF an den Datenbus
Mit dieser Verbindung können
Adress Bus , Adressdecoder Adresse vergleichen
Peripherie vs Speicher
Speicher : bleibt so lange stehen bis wir was reinschreiben
Peripherie :
int i = 0 ;
int a[2] = {1,2};
a[i] = i++; Zwei Seiteneffekte : lese i und schreibe i++
Bei dem Seiteneffekt ist nicht definiert, was zuerst passieren soll
Sequence point : Punkt zu dem ein Seiteneffekt ausgeführt werden muss
Semikolon ist zum Beispiel ein Sequence Point
'bei jedem Prozessor ist der Speicherzugriff der Flaschenhals '
Start : Registerzugriff Ende : registerzugriff
t0 = timer ;
...
t1 = timer ;
dt = t1-t0:
VOLATILE IS THE SOLUTION
Eine variable kann const und volatile gleichzeitig sein Sagt dem Compiler ! nicht Prozessor ! Redunande Variablen werden nicht wegoptimiert und der Ablauf nicht verändert
”const” == read only
kann nicht auf der linken seite eines gleichheitszeichens stehen ist ein L Side Evaluable
int x = 42;
int const * p = &x;
*p = 43; // FAILURE !
x = 44;
if (*p == 44) ...... ;
static int const answer = 42; // Hat die Speicherklasse storage class
// answer wird im ROM gelagert, ist read only
answer = 43; // FAILURE !
int* const p = &answer ; // FAILURE
int* const q = ( int const* )&answer;
*q = 44;
Auf dem PC kann das funktionieren : Das Programm läuft im RAM ! kein ROM
Dem Compiler müssen wir immer angeben ob volatile etc. …
Inversion of Control
RMW → read modify write
Im Embedded Bereich kann es mittels Semaphoren zu Deadlocks kommen Darauf achten,