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.
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
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.