Nested Interrupts ARM7 LPC2148

Gast #1677082
Lesenswert?

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
void Timer0_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
Angehängte Dateien:
Gast #1685174
Lesenswert?

Hoi,

Ich habs probiert, leider hats nichts gebracht. Ich erhalte dieselben 
Fehlermeldungen:

timer.c(67): error:  #20: identifier "LR" is undefined
timer.c(67): error:  #20: identifier "STMFD" is undefined
timer.c(67): error:  #20: identifier "SP" is undefined
...

Ich wäre froh, wenn mir jemand helfen könnte. Ich beherrsche Assembler 
nicht sehr, bräuchte deshalb Hilfe....

Danke, Gruss
Gast #1685386
Lesenswert?

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    #if NESTED_INTERRUPT
2
90    #define IENABLE                      \/* Nested Interrupts Entry */
3
91      __asm { MRS     LR, SPSR    };     \/* Copy SPSR_irq to LR     */
4
92      __asm { STMFD   SP!, {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
Gast #1685591
Lesenswert?

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.
Gast #1689881
Lesenswert?

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
Persönliche Seite #1695642
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren