Hallo Zusammen,
Es dreht sich um folgendes: Ich möchte mit meinem LPC2148 Nested
Interrupts behandeln. Ich programmiere mit uVision3 einen LPC2148 auf
dem Evaluationsboard MCB2140 von Keil. Im Anhang habe ich die
IRQ-Dateien von Keil, wie sie im Beispielcode dabei waren (old). Die
Makros befinden sich im unteren Teil der Datei. Sie sollten einfach Am
Anfang der Interrupt-Soubroutine aufgerufen werden, am Schluss
ebenfalls:
1
voidTimer0_Handler(void)__irq
2
{
3
T0IR=(1<<0);//Clear Interrupt Flag
4
IENABLE;//Handles Nested Interrupts
5
6
//Interrupt Code...
7
8
IDISABLE;//Neglect Nested Interrupts
9
10
VICVectAddr=0;
11
}//Timer0_Handler(...
Die alten Makros funktionieren nicht richtig, und ich weiss nicht,
wieso. Ich kann nicht wirklich Assembler-Programmieren.
In den neuen Makros sieht man, dass ich die Nested-Interrupt-Behandlung
wie in der AN10381 angegeben realisiert habe. Leider hat nun mein
Compiler Schwierigkeiten, er kennt die Begriffe SP und LR nicht.
Nun meine Frage:
Wie kann ich die neuen Makros realisieren, dass der Compiler nicht mehr
reklamiert und die Funktion noch dieselbe ist?
Ich weiss, dass dies eine relativ komplexe Frage ist, ich muss auch
erwähnen, dass das gesamte Projekt sehr umfangreich ist und die Hardware
dementsprechend viele Komponenten besitzt.
Ich wäre froh, wenn ich so schnell als möglich Antworten erhalte,
Grüsse aus der Schweiz, baldi
Hallo,
Danke für deine Antwort, aber leider funktioniert das auch nicht. Ich
habe hier ein Teil der Fehlermeldungen, die auftreten (insgesamt sind es
ca 100):
irq.h(91): error: #40: expected an identifier
irq.h(91): error: #666: "asm" must be used with a function definition
irq.h(91): error: #65: expected a ";"
irq.h(91): error: #7: unrecognized token
Auf dieser Zeile befindet sich der erste inline-Assemblerbefehl:
1
89#ifNESTED_INTERRUPT
2
90#defineIENABLE\/* Nested Interrupts Entry */
3
91__asm{MRSLR,SPSR};\/* Copy SPSR_irq to LR */
4
92__asm{STMFDSP!,{LR}};\/* Save SPSR_irq */
5
93...
Wer hat sonst noch eine Idee? Ich weiss, dass die Lösung nicht so auf
der Hand liegt, ich suche schon seit einer Ewigkeit (2 Wochen, wo soll
es da hin gehen mit der Menschheit, wenn bereits 2 Wochen als Ewigkeit
angeschaut werden... ;-)
Ich bin froh um Ideen, Anregungen, Inputs etc. Wenn jemand die Lösung
kennt, darf er sie auch ruhig hinschreiben...
Gruss
Also, ohne Kenntnisse des Keil-Compilers...
1) LR is undefined: okay, beschaff Dir ein Register (warum
auskommentiert?)
2) STMFD usw..., im Original stehen Semikolons zwischen den Befehlen,
der Backslash frisst den Zeilenumbruch, also sind die Befehle nicht
getrennt. Wie lautet nun also die Syntax für asm? Das kann man doch
nachschauen...
Grüße.
Hallo,
Frosch schrieb:> 1) LR is undefined: okay, beschaff Dir ein Register (warum> auskommentiert?)
Das ist auskommentiert, weil ich nicht in eine Variable schreiben will,
sondern in dieses LR (Link Register, r14).
> 2) STMFD usw..., im Original stehen Semikolons zwischen den Befehlen,> der Backslash frisst den Zeilenumbruch, also sind die Befehle nicht> getrennt. Wie lautet nun also die Syntax für asm?
Wie ich bereits erwähnte, ich bin Noob in Assembler.
> Das kann man doch nachschauen...
Wo? Ich habe da auch schon eine Weile gesucht, leider noch nichts
gefunden. Danke vielmals für den Tipp/Hinweis.
Aber ich werde immer noch nicht schlau draus... vielleicht liegts an
mir?
Egal, bin froh für weitere Hilfe!
Gruss
Baldrian schrieb:>> 1) LR is undefined: okay, beschaff Dir ein Register (warum>> auskommentiert?)>> Das ist auskommentiert, weil ich nicht in eine Variable schreiben will,> sondern in dieses LR (Link Register, r14).
Genau das ist aber mit Inline Assembler im von Keil verwendeten
RealView Compiler nicht so einfach.
Einfach mal in die Doku schauen:
"No virtual registers are created for the sp (r13), lr (r14), and pc
(r15) registers, and they cannot be read or directly modified in
inline assembly code."
Siehe:
http://infocenter.arm.com/help/topic/com.arm.doc.kui0097a/armcc_chdgbbia.htm
Da diese Instruktionen den Prozessormode umschalten (anderer Stack,
anderes Link Register), und Inline Assembler im RealView Compiler
zwecks Instruktion Scheduling auch noch durch den Optimierer läuft,
kann das in diesem Fall zu einem großen Durcheinander führen.
Gruß
Marcus