Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Laderegler Test Tueftler Seite

K (avr-gcc)
Zeile 24: Zeile 24:
 
=avr-gcc=
 
=avr-gcc=
 
* [[avr-gcc#Interrupts]]
 
* [[avr-gcc#Interrupts]]
 +
* [[avr-gcc#C.2B.2B]]
 
* [[avr-gcc#Inkompatibilität]]
 
* [[avr-gcc#Inkompatibilität]]
 
* [[avr-gcc#Bit 7 bei SFR-Zugriff]]
 
* [[avr-gcc#Bit 7 bei SFR-Zugriff]]

Version vom 7. März 2007, 19:15 Uhr

Da bei der Interrupt-Programmierung einige Besonderheiten zu beachten sind, soll dies in einem eigenen Artikel zusammengefasst werden.

Weil die Interrupt-Programmierung sehr stark von der zugrundeliegenden Hardware abhängt, ist allerdings ist in keiner C-Spezifikation festgehalten, wie etwa der Definition einer Interrupt Service Routine auszusehen hat oder wie Interrupts aktiviert oder deaktiviert werden.

Dies führt dazu, daß etwa die Definition einer ISR nicht nur von der Hardware abhängig ist, sondern auch vom verwendeten C/C++-Compiler.

Aufgabenstellungen

Bei der Interruptprogrammierung sieht man sich verschiedenen Ausgaben gegenüber

Interrupts aktivieren/deaktivieren
Global
Damit überhaupt Interrupts von der Hardware ausgelöst werden, müssen Interrupts global aktiviert werden. Dies sieht ja nach Hardware und Compiler sehr verschieden aus, und teilweise ist diese Operation nur Benutzern mit Sonderrechten erlaubt.
Spezielle IRQs
Damit eine spezielle IRQ ausgelöst wird, muss diese zudem erlaubt worden sein. Dazu gibt es in der Regel spezelle Register, in denen dazu ein Bit gesetzt/gelöscht werden muss. Dies trifft zu für die so genannten "maskierbaren Interrupts". Maskierbar bedeutet dabei, daß man im Programm einstellen kann, ob man eine gewisse IRQ auslösen lassen will oder nicht. Das Gegenstück dazu sind die nicht-maskierbaren Interrupts, degen deren Auftreten man sich nicht wehren kann. Ein Beispiel für einen nicht-maskierbaren Interrupts ist der RESET wie er zum Beispiel nach Einschalten der Spannungsversorgung ausgelöst wird.
Interrupt-Service-Routine (ISR) implementieren/deklarieren
Nachdem ein Ereignis eine Interrupt-Anforderung (IRQ) ausgelöst hat, wird ein bestimmtes Codestück (ISR) ausgeführt – natürlich unter der Voraussetzung, daß diese IRQ wie oben beschrieben zugelassen wurde. Dazu wird nach Auftreten des Ereignisses der normale Programmfluss unterbrochen und der Code der ISR ausgeführt. Nach Beenden der ISR wird der Programmfluss entweder an der unterbrochenen Stelle fortgesetzt oder es werden weitere IRQs ausgelöst, die sich die Hardware gemwerkt hat und deren ISR noch nicht ausgeführt wurden. Wie dieser Ablauf genau von statten geht ist stark von der Hardware anhängig, ebenso wie die Art und Weise wie mitgeteilt wird, daß es sich bei einem Codestück – üblicherweise eine C-Funktion – um eine ISR handelt. Dementsprechend verschieden sieht die Umschreibung dafür in unterschiedlichen C-Compilern aus.
Interrupt-Prioritäten festlegen
Daten-Integrität sicherstellen


avr-gcc


LiFePO4 Speicher Test