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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.