ARM externer Interrupt - Routine

OP #675070
Hallo,

wenn ein externer Interrupt auftritt, wird der entsprechende Interrupt 
im µController ausgelöst und es wird zu dieser Adresse im Speicher 
gesprungen wo dieser IRQ definiert ist. Dort befindet sich die Adresse 
wo`s weiter geht oder? muss ich in meinem Programm dann selbst 
schreiben, was innerhalb so einer Interrupt-Routine passiert? sozusagen 
als eigenen Programmteil innerhalb der Main Routine oder wie sieht das 
aus?

externer Interrupt --> IRQ wird ausgelöst, Register werden gesichert und 
in den richtigen Mode (bei einem ARM Prozessor AT91RM9200) gewechselt. 
Dieser IRQ befindet sich bei einer xy-Adresse. Und an dieser Adresse 
steht eine weitere wo sich die Interrupt-Routine befindet - aber wie 
sieht so eine Interrupt Routine dann aus?

Hat da jmd ein Bsp für mich - hab diesen Sachverhalt leider noch nicht 
ganz verstanden.

Gruß
Tina
Hallo Tina,
womit programmierst du denn?

In Bascom muss man erstmal den Interrupt entsprechen konfigurieren und 
schreibt dann sozusagen eine sub Routine die ausgeführt wird wenn der 
Interrupt kommt.

Wird in C ähnlich laufen. Assembler hab ich keine Ahnung von...

Grüße

Jörg
Wenn du einen Compiler benutzt, kümmert der sich um die Adressierung.
(Ich setze einfach mal vorraus, dass man bei einem ARM einen 
[C-]Compiler benutzt).
Dann muß man nur den Interrupt freigeben (über entsprechende Flags in 
den Konfigurationsregistern) und dann alle freigegebenen wiederum global 
freigeben.
In Assembler muß man sich da selber drum kümmern.
OP
ich arbeite mit der Keil Umgebung und dem Real-Compiler.... und 
programmiere in C...

Das Startup-Skript ist allerdings in Assembler von Keil geschrieben; und 
da hab ich halt nichts gefunden, außer dass die Interrupts IRQ definiert 
werden wo sie sich befinden, aber nicht was danach passiert - das kann 
ich mir einfach noch nicht so vorstellen, was passiert wenn der PC auf 
diese Adresse vom IRQ springt, was dann als nächstes passiert.

>Wenn du einen Compiler benutzt, kümmert der sich um die Adressierung.

d.h. der Rest läuft komplett intern im jeweiligen Prozessor ab, ohne 
dass ich darauf einfluss nehme... z.B. wie bei einem Data-Abort, wo ich 
dann in einem speziellen Register nur noch sehen kann, das ein solcher 
aufgetreten ist und wo...

das ich halt dann nicht so ganz verstehe, ist dass im Startup-Skript ja 
auch definiert wird, wieviel Speicherplatz so eine IRQ benötigt und beim 
gleichen Prozessor AT91RM9200 gibt es im Netz ganz unterschiedliche 
Speichergrößen von 0 - 32 Byte (bei Keil z.B. IRQ_Stack_Size  EQU 
0x00000080).

bei dem USR_Stack_Size  EQU     0x00000400 ist es sogar ziemlich viel. 
Oder beschreibt man da dann selbst was passieren soll in seinem 
C-Programm?

Gruß
Tina

Gruß
Tina
>das kann ich mir einfach noch nicht so vorstellen, was passiert wenn der PC auf 
>diese Adresse vom IRQ springt, was dann als nächstes passiert.

Die ISR liest das Register AIC_IVR des Interruptcontrollers aus. In 
diesem steht die Adresse der ISR des eingetretenen Interrupts. Diese 
muss man natürlich zuvor manuell in den AIC geschrieben haben.

>das ich halt dann nicht so ganz verstehe, ist dass im Startup-Skript ja
>auch definiert wird, wieviel Speicherplatz so eine IRQ benötigt und beim
>gleichen Prozessor AT91RM9200 gibt es im Netz ganz unterschiedliche
>Speichergrößen von 0 - 32 Byte (bei Keil z.B. IRQ_Stack_Size  EQU
>0x00000080).

Beim ARM hat (fast) jeder Betriebsmodus seinen eigenen Stack, wo er 
Rücksprungadressen und Register sichern kann. Wie viel Stack Deine ISRs 
benötigen, musst Du selbst entscheiden. Wenn es nicht gerade auf jedes 
Byte im Ram ankommt, empfielt es sich, ihn möglichst groß zu machen, 
instesondere dann, wenn die ISR weitere Funktionen aufruft.

Übrigens kann man das alles auch im Datenblatt des AT91RM9200 nachlesen: 
http://www.ortodoxism.ro/datasheets/atmel/doc1768.pdf

MfG Mark

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 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.