systemnahe programmierung in c (spic) · 2020. 7. 3. · systemnahe programmierung in c (spic) 20...
TRANSCRIPT
![Page 1: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/1.jpg)
Systemnahe Programmierungin C (SPiC)
20 Unterbrechungen – Nebenläufigkeit
Jürgen Kleinöder, Daniel Lohmann, Volkmar Sieh
Lehrstuhl für Informatik 4Verteilte Systeme und Betriebssysteme
Friedrich-Alexander-UniversitätErlangen-Nürnberg
Sommersemester 2020
http://www4.cs.fau.de/Lehre/SS20/V_SPIC
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 2: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/2.jpg)
Nebenläufigkeit
Definition: Nebenläufigkeit
Zwei Programmausführungen A und B sind nebenläufig (A|B),
wenn für einzelne Instruktionen a aus A und b aus B nicht feststeht,
ob a oder b tatsächlich zuerst ausgeführt wird (a, b oder b, a).
Nebenläufigkeit tritt auf durch
Interrupts; IRQs können ein Programm an „beliebiger Stelle“ unterbrechen
Echt-parallele Abläufe (durch die Hardware); andere CPU / Peripherie greift „ jederzeit“ auf den Speicher zu
Quasi-parallele Abläufe (z. B. Fäden in einem Betriebssystem); Betriebssystem kann „ jederzeit“ den Prozessor entziehen
Problem: Nebenläufige Zugriffe auf gemeinsamen Zustand
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–1
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 3: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/3.jpg)
Nebenläufigkeitsprobleme
Szenario
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
static volatile uint16_t cars;
void main(void) {while (1) {waitsec(60);send(cars);cars = 0;
}}
// photo sensor is connected// to INT2
ISR(INT2_vect) {cars++;
}
Wo ist hier das Problem?
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–2
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 4: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/4.jpg)
Nebenläufigkeitsprobleme
Szenario
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
static volatile uint16_t cars;
void main(void) {while (1) {waitsec(60);send(cars);cars = 0;
}}
// photo sensor is connected// to INT2
ISR(INT2_vect) {cars++;
}
Wo ist hier das Problem?
Sowohl main() als auch ISR lesen und schreiben cars
; Potentielle Lost-Update -Anomalie
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–2
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 5: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/5.jpg)
Nebenläufigkeitsprobleme
Szenario
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
static volatile uint16_t cars;
void main(void) {while (1) {waitsec(60);send(cars);cars = 0;
}}
// photo sensor is connected// to INT2
ISR(INT2_vect) {cars++;
}
Wo ist hier das Problem?
Sowohl main() als auch ISR lesen und schreiben cars
; Potentielle Lost-Update -AnomalieGröße der Variable cars übersteigt die Registerbreite; Potentielle Read-Write -Anomalie
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–2
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 6: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/6.jpg)
Nebenläufigkeitsprobleme (Forts.)
Wo sind hier die Probleme?
Lost-Update: Sowohl main() als auch ISR lesen und schreiben cars
Read-Write: Größe der Variable cars übersteigt die Registerbreite
Wird oft erst auf der Assemblerebene deutlich
void main(void) {· · ·
send(cars);cars = 0;
· · ·
}
// photosensor is connected// to INT2
ISR(INT2_vect) {cars++;
}
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,cars ; load cars.lolds r25,cars+1 ; load cars.hiadiw r24,1 ; add (16 bit)sts cars+1,r25 ; store cars.hists cars,r24 ; store cars.lo· · · ; restore regs
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–3
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 7: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/7.jpg)
Nebenläufigkeitsprobleme: Lost-Update -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–4
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 8: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/8.jpg)
Nebenläufigkeitsprobleme: Lost-Update -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=5 und an dieser Stelle tritt der IRQ ( ) auf
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–4
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 9: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/9.jpg)
Nebenläufigkeitsprobleme: Lost-Update -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=5 und an dieser Stelle tritt der IRQ ( ) auf
main hat den Wert von cars (5) bereits in Register gelesen(Register 7→ lokale Variable)
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–4
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 10: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/10.jpg)
Nebenläufigkeitsprobleme: Lost-Update -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=5 und an dieser Stelle tritt der IRQ ( ) auf
main hat den Wert von cars (5) bereits in Register gelesen(Register 7→ lokale Variable)
INT2_vect wird ausgeführt
Register werden gerettet
cars wird inkrementiert ; cars=6
Register werden wiederhergestellt
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–4
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 11: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/11.jpg)
Nebenläufigkeitsprobleme: Lost-Update -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=5 und an dieser Stelle tritt der IRQ ( ) auf
main hat den Wert von cars (5) bereits in Register gelesen(Register 7→ lokale Variable)
INT2_vect wird ausgeführt
Register werden gerettet
cars wird inkrementiert ; cars=6
Register werden wiederhergestellt
main übergibt den veralteten Wert von cars (5) an send
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–4
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 12: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/12.jpg)
Nebenläufigkeitsprobleme: Lost-Update -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__sts cars,__zero_reg__· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=5 und an dieser Stelle tritt der IRQ ( ) auf
main hat den Wert von cars (5) bereits in Register gelesen(Register 7→ lokale Variable)
INT2_vect wird ausgeführt
Register werden gerettet
cars wird inkrementiert ; cars=6
Register werden wiederhergestellt
main übergibt den veralteten Wert von cars (5) an send
main nullt cars ; 1 Auto ist „verloren“ gegangen
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–4
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 13: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/13.jpg)
Nebenläufigkeitsprobleme: Read-Write -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–5
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 14: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/14.jpg)
Nebenläufigkeitsprobleme: Read-Write -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=255 und an dieser Stelle tritt der IRQ ( ) auf
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–5
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 15: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/15.jpg)
Nebenläufigkeitsprobleme: Read-Write -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=255 und an dieser Stelle tritt der IRQ ( ) auf
main hat bereits cars=255 Autos mit send gemeldet
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–5
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 16: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/16.jpg)
Nebenläufigkeitsprobleme: Read-Write -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=255 und an dieser Stelle tritt der IRQ ( ) auf
main hat bereits cars=255 Autos mit send gemeldet
main hat bereits das High-Byte von cars genullt; cars=255, cars.lo=255, cars.hi=0
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–5
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 17: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/17.jpg)
Nebenläufigkeitsprobleme: Read-Write -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__
· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=255 und an dieser Stelle tritt der IRQ ( ) auf
main hat bereits cars=255 Autos mit send gemeldet
main hat bereits das High-Byte von cars genullt; cars=255, cars.lo=255, cars.hi=0
INT2_vect wird ausgeführt; cars wird gelesen und inkrementiert, Überlauf ins High-Byte; cars=256, cars.lo=0, cars.hi=1
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–5
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 18: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/18.jpg)
Nebenläufigkeitsprobleme: Read-Write -Anomalie
main:· · ·
lds r24,carslds r25,cars+1rcall sendsts cars+1,__zero_reg__
sts cars,__zero_reg__· · ·
INT2_vect:· · · ; save regslds r24,carslds r25,cars+1adiw r24,1sts cars+1,r25sts cars,r24· · · ; restore regs
Sei cars=255 und an dieser Stelle tritt der IRQ ( ) auf
main hat bereits cars=255 Autos mit send gemeldet
main hat bereits das High-Byte von cars genullt; cars=255, cars.lo=255, cars.hi=0
INT2_vect wird ausgeführt; cars wird gelesen und inkrementiert, Überlauf ins High-Byte; cars=256, cars.lo=0, cars.hi=1
main nullt das Low-Byte von cars
; cars=256, cars.lo=0, cars.hi=1; Beim nächsten send werden 255 Autos zu viel gemeldet
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–5
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 19: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/19.jpg)
Interruptsperren: Datenflussanomalien verhindern
void main(void) {while(1) {waitsec(60);cli();send(cars);cars = 0;sei();
}}
Wo genau ist das kritische Gebiet?
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–6
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 20: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/20.jpg)
Interruptsperren: Datenflussanomalien verhindern
void main(void) {while(1) {waitsec(60);cli();send(cars);cars = 0;sei();
}}
kritisches Gebiet
Wo genau ist das kritische Gebiet?
Lesen von cars und Nullen von cars müssen atomar ausgeführt werden
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–6
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 21: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/21.jpg)
Interruptsperren: Datenflussanomalien verhindern
void main(void) {while(1) {waitsec(60);cli();send(cars);cars = 0;sei();
}}
kritisches Gebiet
Wo genau ist das kritische Gebiet?
Lesen von cars und Nullen von cars müssen atomar ausgeführt werden
Dies kann hier mit Interruptsperren erreicht werden
ISR unterbricht main, aber nie umgekehrt ; asymmetrische
Synchronisation
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–6
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 22: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/22.jpg)
Interruptsperren: Datenflussanomalien verhindern
void main(void) {while(1) {waitsec(60);cli();send(cars);cars = 0;sei();
}}
kritisches Gebiet
Wo genau ist das kritische Gebiet?
Lesen von cars und Nullen von cars müssen atomar ausgeführt werden
Dies kann hier mit Interruptsperren erreicht werden
ISR unterbricht main, aber nie umgekehrt ; asymmetrische
Synchronisation
Achtung: Interruptsperren sollten so kurz wie möglich sein
Wie lange braucht die Funktion send hier?
Kann man send aus dem kritischen Gebiet herausziehen?
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–6
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 23: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/23.jpg)
Nebenläufigkeitsprobleme (Forts.)
Szenario, Teil 2 (Funktion waitsec())
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) { // wait for eventsleep_cpu(); // until next irq
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Wo ist hier das Problem?
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–7
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 24: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/24.jpg)
Nebenläufigkeitsprobleme (Forts.)
Szenario, Teil 2 (Funktion waitsec())
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) { // wait for eventsleep_cpu(); // until next irq
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Wo ist hier das Problem?
Test, ob nichts zu tun ist, gefolgt vonSchlafen, bis etwas zu tun ist
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–7
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 25: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/25.jpg)
Nebenläufigkeitsprobleme (Forts.)
Szenario, Teil 2 (Funktion waitsec())
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) { // wait for eventsleep_cpu(); // until next irq
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Wo ist hier das Problem?
Test, ob nichts zu tun ist, gefolgt vonSchlafen, bis etwas zu tun ist
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–7
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 26: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/26.jpg)
Nebenläufigkeitsprobleme (Forts.)
Szenario, Teil 2 (Funktion waitsec())
Eine Lichtschranke am Parkhauseingang soll Fahrzeuge zählenAlle 60 Sekunden wird der Wert an den Sicherheitsdienst übermittelt
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) { // wait for eventsleep_cpu(); // until next irq
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Wo ist hier das Problem?
Test, ob nichts zu tun ist, gefolgt vonSchlafen, bis etwas zu tun ist; Potentielle Lost-Wakeup -Anomalie
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–7
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 27: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/27.jpg)
Nebenläufigkeitsprobleme: Lost-Wakeup -Anomalie
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) {sleep_cpu();
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Angenommen, an dieser Stelle tritt der Timer-IRQ ( ) auf
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–8
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 28: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/28.jpg)
Nebenläufigkeitsprobleme: Lost-Wakeup -Anomalie
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) {sleep_cpu();
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Angenommen, an dieser Stelle tritt der Timer-IRQ ( ) auf
waitsec hat bereits festgestellt, dass event nicht gesetzt ist
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–8
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 29: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/29.jpg)
Nebenläufigkeitsprobleme: Lost-Wakeup -Anomalie
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) {sleep_cpu();
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Angenommen, an dieser Stelle tritt der Timer-IRQ ( ) auf
waitsec hat bereits festgestellt, dass event nicht gesetzt ist
ISR wird ausgeführt ; event wird gesetzt
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–8
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 30: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/30.jpg)
Nebenläufigkeitsprobleme: Lost-Wakeup -Anomalie
void waitsec(uint8_t sec) {· · · // setup timersleep_enable();event = 0;while (! event) {sleep_cpu();
}sleep_disable();
}
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Angenommen, an dieser Stelle tritt der Timer-IRQ ( ) auf
waitsec hat bereits festgestellt, dass event nicht gesetzt ist
ISR wird ausgeführt ; event wird gesetzt
Obwohl event gesetzt ist, wird der Schlafzustand betreten; Falls kein weiterer IRQ kommt, Dornröschenschlaf
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–8
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 31: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/31.jpg)
Lost-Wakeup: Dornröschenschlaf verhindern
1 void waitsec(uint8_t sec) {2 · · · // setup timer3 sleep_enable();4 event = 0;5 cli();6 while (! event) {7 sei();8 sleep_cpu();9 cli();
10 }11 sei();12 sleep_disable();13 }
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
Wo genau ist das kritische Gebiet?
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–9
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 32: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/32.jpg)
Lost-Wakeup: Dornröschenschlaf verhindern
1 void waitsec(uint8_t sec) {2 · · · // setup timer3 sleep_enable();4 event = 0;5 cli();6 while (! event) {7 sei();8 sleep_cpu();9 cli();
10 }11 sei();12 sleep_disable();13 }
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
kritisches Gebiet
Wo genau ist das kritische Gebiet?Test auf Vorbedingung und Betreten des Schlafzustands(Kann man das durch Interruptsperren absichern?)
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–9
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 33: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/33.jpg)
Lost-Wakeup: Dornröschenschlaf verhindern
1 void waitsec(uint8_t sec) {2 · · · // setup timer3 sleep_enable();4 event = 0;5 cli();6 while (! event) {7 sei();8 sleep_cpu();9 cli();
10 }11 sei();12 sleep_disable();13 }
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
kritisches Gebiet
Wo genau ist das kritische Gebiet?Test auf Vorbedingung und Betreten des Schlafzustands(Kann man das durch Interruptsperren absichern?)
Problem: Vor sleep_cpu() müssen IRQs freigegeben werden!
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–9
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 34: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/34.jpg)
Lost-Wakeup: Dornröschenschlaf verhindern
1 void waitsec(uint8_t sec) {2 · · · // setup timer3 sleep_enable();4 event = 0;5 cli();6 while (! event) {7 sei();8 sleep_cpu();9 cli();
10 }11 sei();12 sleep_disable();13 }
static volatile int8_t event;
// TIMER1 ISR// triggers when// waitsec() expires
ISR(TIMER1_COMPA_vect) {event = 1;
}
kritisches Gebiet
Wo genau ist das kritische Gebiet?Test auf Vorbedingung und Betreten des Schlafzustands(Kann man das durch Interruptsperren absichern?)
Problem: Vor sleep_cpu() müssen IRQs freigegeben werden!
Funktioniert dank spezieller Hardwareunterstützung:; Befehlssequenz sei, sleep wird von der CPU atomar ausgeführt
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Wettlaufsituationen 20–9
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2
![Page 35: Systemnahe Programmierung in C (SPiC) · 2020. 7. 3. · Systemnahe Programmierung in C (SPiC) 20 Unterbrechungen – Nebenläufigkeit Jürgen Kleinöder, Daniel Lohmann, Volkmar](https://reader035.vdokument.com/reader035/viewer/2022071101/5fda6edf5465535e100bb9ff/html5/thumbnails/35.jpg)
Zusammenfassung
Interruptbearbeitung erfolgt asynchron zum Programmablauf
Unerwartet ; Zustandssicherung im Interrupt-Handler erforderlichQuelle von Nebenläufigkeit ; Synchronisation erforderlich
Synchronisationsmaßnahmen
Gemeinsame Zustandsvariablen als volatile deklarieren (immer)Zustellung von Interrupts sperren: cli, sei (bei nichtatomarenZugriffen, die mehr als einen Maschinenbefehl erfordern)Bei längeren Sperrzeiten können IRQs verloren gehen!
Nebenläufigkeit durch Interrupts ist eine sehr große FehlerquelleLost-Update und Lost-Wakeup Problemeindeterministisch ; durch Testen schwer zu fassen
Wichtig zur Beherrschbarkeit: Modularisierung →֒ 12–7
Interrupthandler und Zugriffsfunktionen auf gemeinsamen Zustand(static Variablen!) in eigenem Modul kapseln.
c© kls SPiC (SS 20) 20 Unterbrechungen – Nebenläufigkeit – Zusammenfassung 20–10
20-IR
Q-N
eben
laeu
figke
it:2020-0
5-2
2