Forum: Compiler & IDEs Frage zu Interrupts


von Lutz Müller (Gast)


Lesenswert?

Hallo,

beim Lesen der AVR-libc 1.0.4, dem ATMega16-Manual und dem
aktualisierten C-Tutorial im Wiki habe ich mal wieder einiges nicht
verstanden:
1.) Im libc unter 5.17.1 steht, daß bei einer ISR (neben dem SREG) auch
andere gerade verwendete Register gesichert und anschließend wieder
zurückgeschrieben werden müssen. Dies sei mit
__attribute__((interrupt)) in der ISR getan. Kurzum: Ist das im Macro
SIGNAL(signame) nun schon integriert oder muß das noch per Hand gemacht
werden? Mein Problem ist, daß ich diese ganze Geschichte mit den
Unterstrichen (= "vom Compilerhersteller", define über mehrere Ecken)
nicht schnalle.
2.) Im C-Tutorial steht, daß man bei z.B. 16 bit-Variablen, die im
Programm und einer ISR genutzt werden, außerhalb der ISR vor einer
Zuweisung dieser Variablen immer cli(); "machen" soll, da sonst bei
diesem Zugriff (2*8 bit hintereinander) nach den ersten 8 bit in die
ISR gesprungen werden könnte und der Wert der Variablen dann Quatsch
wäre. Ich meine im Manual gelesen zu haben, daß ein Multicyclezugriff
immer beendet wird, bevor der Interrupt greift. Oder ist mit
"Multicycle" was anderes gemeint?

Gruß
Lutz

von Jörg Wunsch (Gast)


Lesenswert?

1.) Ja, SIGNAL beinhaltet __attribute__((signal)) und rettet damit
auch alle notwendigen Register.  Du musst Dich um weiter nichts
kümmern, als den Code für Deine ISR zu liefern.

2.) Ja, mit `multicycle' in diesem Sinne ist etwas anderes gemeint:
eine Reihe von CPU-Befehlen braucht mehr als einen Zyklus, um
ausgeführt zu werden.  Zwischen diesen Teilzyklen eines Befehls kann
kein Interrupt reinhaken.

Die Bearbeitung einer 16- (oder mehr) Bit-Variable auf einem 8-bit-
Prozessor ist aber nicht atomar, d.h. es wird mehr als ein CPU-Befehl
benötigt.  Das cli()/sei() dient der Absicherung, dass diese
mehr-Befehl-Operation bezüglich eines möglichen Interrupts sich atomar
verhält, d.h. der Interrupt kann entweder vor der Manipulation (oder
gar nur vor der Auswertung) der Variablen zuschlagen oder erst nachdem
die komplette 16-bit-Operation vollendet ist, aber nicht mittendrin.

von Lutz Müller (Gast)


Lesenswert?

Besten Dank,

das bringt mich wieder ein ganzes Stück weiter.

Gruß

Lutz

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.