Forum: Mikrocontroller und Digitale Elektronik ARM externer Interrupt - Routine


von Tina B. (tina)


Lesenswert?

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

von Jörg B. (joerg-sh)


Lesenswert?

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

von Rahul D. (rahul)


Lesenswert?

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.

von Tina B. (tina)


Lesenswert?

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

von Mark .. (mork)


Lesenswert?

>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

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