Nr. | Sicherung in | Code | Zeitbedarf Takte |
Vorteile | Nachteile |
---|---|---|---|---|---|
1 | Register | in R15,SREG [...] out SREG,R15 | 2 | Schnell | Register- verbrauch |
2 | Stapel | push R0 in R0,SREG [...] out SREG,R0 pop R0 | 6 | Kein Register- verbrauch | Lahm |
3 | SRAM | sts $0060,R0 in R0,SREG [...] out SREG,R0 lds R0,$0060 | 6 |
Isr1:
[...]
sbr rFlag,1<<bitA ; setze Bearbeitungsflagge A
[...]
Isr2:
[...]
sbr rFlag,1<<bitB ; setze Bearbeitungsflagge B
[...]
Wenn jetzt in der Hauptprogrammschleife die beiden Bits nacheinander abgefragt und
Behandlungsroutinen aufgerufen werden, kann entweder bitA oder bitB oder sowohl bitA
als auch bitB gesetzt sein. Auf jeden Fall müssen die gesetzten Flaggen so schnell
wie möglich wieder auf Null gesetzt werden, denn der nächste Interrupt kann
schon bald wieder zuschlagen. Auf keinen Fall dürfen wir beide Flaggen erst nach
einer aufwändigen Bearbeitung löschen, weil wir dann vielleicht die
nächste Bearbeitungsanforderung verpassen würden. Es lohnt sich dann, mit der
in schnellerer Folge auftretenden Anforderung zu beginnen und dann die etwas
gemütlicher werkelnde zweite Anforderung zu bearbeiten. Wenn A häufiger ist
als B, z.B. so:
Loop:
sleep ; schlafen legen
nop ; Dummy nach Aufwachen
sbrc rFlag,bitA ; frage erst bitA ab
rcall BearbA ; bearbeite Anforderung A
sbrc rFlag,bitB ; frage dann bitB ab
rcall BearbB ; bearbeite dann Anforderung B
sbrc rFlag,bitA ; frage zur Sicherheit noch mal bitA ab
rcall BearbA ; bearbeite weitere Anforderung A, falls nötig
rjmp Loop ; gehe wieder schlafen
;
BearbA: ; Bearbeite Anforderung A
cbr rFlag,1<<bitA ; lösche vor der Bearbeitung die gesetzte Flagge
[...]
ret
;
BearbB: ; Bearbeite Anforderung B
cbr rFlag,1<<bitB ; lösche vor der Bearbeitung die gesetzte Flagge
[...]
ret
Man beachte, dass in beiden Fällen immer nur ein Bit im Register rFlag
zurückgesetzt werden darf, also auf keinen Fall CLR rFlag, weil es könnten
ja in seltenen Fällen auch beide gleichzeitig gesetzt worden sein.