mikrocontroller.net

Forum: Compiler & IDEs Frage zu Interrupts


Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lutz Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank,

das bringt mich wieder ein ganzes Stück weiter.

Gruß

Lutz

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.