mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nested Interrupts ARM7 LPC2148


Autor: Baldrian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void Timer0_Handler(void) __irq          
{                      
  T0IR = (1<<0);                //Clear Interrupt Flag
  IENABLE;                      //Handles Nested Interrupts
  
  //Interrupt Code...

  IDISABLE;                     //Neglect Nested Interrupts
                  
  VICVectAddr = 0;
}//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

Autor: silvan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hei,

Ich weiss nicht genau, aber

Autor: Baldrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Silvan,

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

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

Autor: silvan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte. XD

ich helfe gern

lg

Autor: User (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß

Autor: Baldrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Baldrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
89    #if NESTED_INTERRUPT
90    #define IENABLE                      \/* Nested Interrupts Entry */
91      __asm { MRS     LR, SPSR    };     \/* Copy SPSR_irq to LR     */
92      __asm { STMFD   SP!, {LR}   };     \/* Save SPSR_irq           */ 
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

Autor: Frosch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Baldrian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: silvan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin noch nicht ganz sicher, aber....

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.k...

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.