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

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 in keiner C-Spezifikation festgehalten, wie etwa die Definition einer Interrupt Service Routine auszusehen hat oder wie Interrupts aktiviert oder deaktiviert werden.

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

Aufgabenstellungen

Bei der Interruptprogrammierung sieht man sich verschiedenen Aufgaben 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 (Supervisor) erlaubt.
Spezielle IRQs
Damit eine spezielle IRQ ausgelöst wird, muss diese zudem erlaubt worden sein. Dazu gibt es in der Regel spezielle 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, gegen deren Auftreten man sich nicht wehren kann. Ein Beispiel für einen nicht-maskierbaren Interrupt 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ß dieser 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 gemerkt 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
Manche Archiketuren erlauben es, einer IRQ eine bestimmte Priorität zuzuordnen. Dadurch wird es möglich eine niederpriore IRQ von einer höherprioren IRQ unterbrechen zu lassen, während eine IRQ nicht von einer nieder- oder gleichprioren IRQ unterbrochen werden kann. Die Zuordnung der Prioritäten geschieht über spezielle, dafür vorgesehene SFRs. Zum Teil (z.B. AVR) bezieht sich die Priorität auch nur darauf welche ISR zuerst ausgeführt wird, wenn mehrere Interrupts anfordert werden. Ein Unterbrenchen anderer Interrupts ist dabei nicht vorgesehn und müßte von Hand Implementiert werden.
Daten-Integrität sicherstellen


avr-gcc


LiFePO4 Speicher Test