Forum: Mikrocontroller und Digitale Elektronik ARM7 - Verhalten im IRQ


von Jens Altenburg (Gast)


Lesenswert?

Hallo,

beim Einsprung in den Interrupt ersetzt der ARM die Registerinhalte von
SP und LR durch SP_irg und LR_irq. Der SP_irg zeigt auf den
Interrupt-Stack, das ist klar. Unklar ist der Inhalt des LR_irq. Die
Rücksprungadresse steht im (verborgenen) LR. Offenbar ist der Inhalt
des LR_irq beim Einsprung in die ISR bedeutungslos ???
Erst wenn in der ISR zu Unterprogrammen verzweigt wird, erscheint der
Inhalt sinnvoll (das schrittweise Durchsteppen ist nur teilweise
möglich, d.h. bringt keine richtige Erklärung des CPU-Verhaltens).
Der Rücksprung aus dem Interrupt erfolgt mit subs pc, lr, #4. Das wäre
mir ebenfalls klar. Aber: das CrossStudio erzeugt nach dem Rücksprung
weiteren Code. Wozu? Zum Auffüllen der Pipeline?
Die Frage also, gibt es ein passendes Papier, indem des Verhalten des
ARM im IRQ etwas ausführlicher beschrieben wird (nicht Assembler Manual
und auch nicht das LPC-ARM-Buch von Hitex, das hilft nicht wirklich).

MfG

Jens

von Jens Altenburg (Gast)


Lesenswert?

Ergänzung,

die Frage nach dem Inhalt des LR_irq beim Einsprung in die ISR ist
geklärt (zeigt auf das Ende des __ARMLIB_enableIRQ Makros).

MfG

Jens

von Andi (Gast)


Lesenswert?

Hast Du schon in die Datenblätter gesehen?

http://www.arm.com/documentation/ARMProcessor_Cores/index.html

von Jens Altenburg (Gast)


Lesenswert?

Falls ich mich nicht verzählt habe sind es 46 unterschiedliche
Downloads. Eine sicher höchst interessante Lektüre.
Ich bezweifle allerdings dort Erläuterungen zu meiner Frage zu finden.
Für die meisten Anwender sollte dieses Thema auch nicht von belang
sein, da sich normalerweise der Compiler um die Registerzuweisung
kümmert.
Ich möchte/will/brauche aber ein äußerst kompaktes und durchschaubares
Multitasking für den ARM.
Dazu muß ich (leider) an den Registern 'rumfummeln. Im konkreten Fall
ist das Problem möglicherweise im Zusammenhang mit dem CrossStudio zu
suchen, d.h. im Debugging Mode arbeitet mein Beispiel so wie es soll
(also so wie ich meine, daß es funktionieren muß), ohne CrossStudio
geht es halt nicht.

MfG

Jens

von mthomas (Gast)


Lesenswert?

Die ARM-Dokumentation nach "nested Interrupts" zu durchsuchen, sollte
brauchbare Information bringen. Im Moment leider keine konkrete URL zur
Hand, aber die Funktion der Stackpointer und Linkregister bei den
verschiedenen Interrupts wird in diesem Zusammenhang gut erklaert.
FreeRTOS-Ansatz nicht kompakt genug? Nur aus Interesse: warum "muss"
an den Registern "rumgefummelt" werden?
Martin

von Jens Altenburg (Gast)


Lesenswert?

@FreeRTOS und Co. zu aufwendig?
Ich verwende sehr gern das Minimalmultitasking UEXC von Richard Man.
Mittlerweile habe ich es auf weitere µC portiert. Das ist genau das was
ich brauche. Nur leider ist die Portierung auf den ARM nicht (?)
möglich/zu aufwendig.
In praktisch allen meinen Embedded Applikationen kann die zu lösende
Aufgabe in zwei Komponenten zerlegt werden; schnelle Funktionen mit
harten Echtzeitanforderungen und Funktionalitäten mit hohem
Rechenaufwand, meist in der Ausführungszeit deutlich unkritischer.
Der erste Part landet entweder direkt in der ISR oder wird in
kooperativ arbeitende zyklisch laufende Schnippselchen zerlegt, z.B.
Aufruf in einem Raster von ca. 25 ms.
Komplexe Algorithmen in kurze Sequenzen zu zerlegen ist in der Regel
aufwendig; hier ist es schön, gelingt es die Arbeit in eine "endless
loop" zu verpacken.
Ist eine Kommunikation zwischen Funktionen nötig, werden die
Schnittstellen entsprechend definiert, die Vorzüge von verfügbaren
Semaphoren oder Message-Queues greifen nur bedingt.
Nicht zu letzt ist die Sicherheit und Testbarkeit ein wichtiges
Kriterium. Je nach Anforderung der Applikation muß ich bei Verwendung
zusätzlicher Komponenten diese auch zusätzlich testen. Mit anderen
Worten ich steige dann ziemlich tief in ein mir fremdes Programm ein.

@Register fummeln
Die Grundfunktionen eines Multitasking-Systems beinhalten das Starten
eines neuen Tasks bzw. den Context-Switch zwischen zwei aktiven Tasks.
Im Regelfall erfolgt dies in einer ISR. Zum Start eines neuen Tasks muß
diesem im Minimum ein eigener Stackbereich zugewiesen werden. Oft
"bastelt" man deshalb einen Interrupt-Return Stack, verläßt dann mit
reti die ISR und der neue Task holt sich seine Werte vom Stack.
Beim ARM geht dies nicht ganz so einfach. Ein reti gibt es dort nicht.
Ich muß also den SP und das LR definiert setzen und dann das
Prozessor-Mode-Register (CPSR) einstellen. Und  genau da liegt der Hase
im Pfeffer. Wenn ich das so mache wie ich der Meinung bin, es tun zu
sollen, funktioniert es nur solange ich über JTAG debugge.
Ohne Debugger gehts halt nicht.
Im Context-Switch muß ich mich wieder an den Registern vergreifen.
Zuerst werden die "alten" Register auf dem "alten" Stack gesichert,
dann der neue Kram vom neuen Stack geholt - ISR verlassen und wie von
Zauberhand ist der neue Task aktiv. So die Theorie. Gehen tuts halt nur
mit Debugger...

Bleibt die Frage zu klären warum ich mir dies antue? Ein fertiges RTOS
und los gehts, oder nicht?
Nun, um es ganz klar zu stellen, ich bin nicht gegen fertige Lösungen,
aber lieber teste und suche ich die Fehler jetzt, als später mit
Schweißperlen auf der Stirn ein riesen System umzugraben, weil es
manchmal/immer/selten abschmiert ohne mir zu sagen warum.

MfG

Jens

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.