Frage zu Interrupts

Gast #178556
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
Gast #178557
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.