Forum: Mikrocontroller und Digitale Elektronik Nested Interrupts ARM7 LPC2148


von Baldrian (Gast)


Angehängte Dateien:

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

von silvan (Gast)


Lesenswert?

Hei,

Ich weiss nicht genau, aber

von Baldrian (Gast)


Lesenswert?

Danke Silvan,

Nun kann ich das Problem lösen ...  =)

Hat sonst noch wer eine Idee, Anregung ... ?

von silvan (Gast)


Lesenswert?

Bitte. XD

ich helfe gern

lg

von User (Gast)


Lesenswert?

Hallo,

LR ist das Linkregister R14 und SP ist der Stackpointer R13.
Vielleicht einfach mal ersetzen.

Gruß

von Baldrian (Gast)


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

von Mars (Gast)


Lesenswert?


von Baldrian (Gast)


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

von Frosch (Gast)


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.

von Baldrian (Gast)


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

von silvan (Gast)


Lesenswert?

bin noch nicht ganz sicher, aber....

von Marcus H. (mharnisch) Benutzerseite


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

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.