Forum: Mikrocontroller und Digitale Elektronik Nested Interrupt für LPC2000 unter RealView möglich?


von DW (Gast)


Lesenswert?

Hallo, liebe Mikrocontroller-Gemeinde,

ich befinde mich gerade bei der Umsetzung der Nested Interrupt Technik 
für ARM7 auf NXP LPC2000-Bausteinen, die unter GCC und Keil CARM 
wunderbar funktioniert, aber von ARM Tools (RealView für ARM) und dem 
Vectored Interrupt Controller VIC grundsätzlich nicht unterstützt wird.

Von Hitex gibt es ein Beispiel, in dem per Inline Assembly ein Makro zum 
Freigeben und Sperren der Nested Interrupts in den Source Code eingefügt 
wird. Das funktioniert wunderbar.

Leider gibt es bei Keil neuerdings nur noch ARM RealView Tools. Ich bin 
daher auf RealView umgestiegen.
Der ehemalige Keil-Compiler CARM, eigentlich sehr gut, hat Ende 2005 ins 
Gras gebissen, und da möchte ich nicht mehr anknüpfen. Und RealView 
verhindert konsequent, in Inline Assembly die physikalischen Register zu 
benutzen. Nur noch Embedded Assembler. Also funktioniert die Sache mit 
den Makros nicht mehr.

Nun habe ich reinen Assembler-Code geschrieben, die Makros umgeschrieben 
als Funktion zum Aufruf aus dem C-Sourcecode, aber der Code ist dank 
Aufruf und Rücksprung und Registersicherung doppelt so groß wie das 
Makro im Beispiel.

Die ursprünglichen Makros sehen folgendermaßen aus:

// Macros for Interrupt Nesting
#define IENABLE                      /* Nested Interrupts Entry */   \
  __asm { MRS     LR, SPSR      }    /* Copy SPSR_irq to LR     */   \
  __asm { STMFD   SP!, {LR}     }    /* Save SPSR_irq           */   \
  __asm { MSR     CPSR_c, #0x1F }    /* Enable IRQ (Sys Mode)   */   \
  __asm { STMFD   SP!, {LR}     }    /* Save LR                 */   \

#define IDISABLE                      /* Nested Interrupts Exit */   \
  __asm { LDMFD   SP!, {LR}     }     /* Restore LR             */   \
  __asm { MSR     CPSR_c, #0x92 }     /* Disable IRQ (IRQ Mode) */   \
  __asm { LDMFD   SP!, {LR}     }     /* Restore SPSR_irq to LR */   \
  __asm { MSR     SPSR_cxsf, LR }     /* Copy LR to SPSR_irq    */   \

Meine Funktionen unter RealView sehen so aus:

nested_irq_enable                       ; Nested Interrupts Freigabe:
                STMFD   SP!, {R0}       ; sichere R0 auf IRQ Stack
                MOV     R0,  LR         ; Returnadr: LR_irq != LR_sys
                MRS     LR,  SPSR       ; sichere SPSR_irq mit Hilfe
                STMFD   SP!, {LR}       ; von LR_irq auf dem IRQ Stack
                MSR     CPSR_c, #0x1F   ; Freigabe IRQ, Mode-Wechsel
                STMFD   SP!, {LR}       ; Sichere LR_sys auf User Stack
                BX      R0              ; zurück zur aufrufenden Stelle

nested_irq_disable                      ; Nested Interrupts Ende:
                MOV     R0,  LR         ; Returnadr: LR_irq != LR_sys
                LDMFD   SP!, {LR}       ; stelle LR_sys wieder her
                MSR     CPSR_c, #0x92   ; sperre IRQ, Mode-Wechsel
                LDMFD   SP!, {LR}       ; regeneriere SPSR_irq mit Hilfe
                MSR     SPSR_cxsf, LR   ; von LR_irq vom IRQ Stack
                MOV     LR,  R0         ; lade Rücksprungadresse
                LDMFD   SP!, {R0}       ; stelle R0 wieder her
                BX      LR              ; zurück zur aufrufenden Stelle

Wesentlich längere Ausführungszeit.

Hat mal jemand eine Idee, was man da sonst noch tun kann?

Gruß

DW

von DW (Gast)


Lesenswert?

Hallo Forum,

nun sind ein paar Tage vergangen, der Umstieg nach RealView ist so 
ziemlich im Kasten, und den Rest werden wir doch auch noch lösen.

Mangels besserer Vorschläge für die Nested Interrupts sage ich mal, daß 
es so geht mit den Unterprogrammen anstatt Makros. Habe gestern 
getestet. Werde die beiden Funktionen jedoch noch etwas im Auge 
behalten, denn bei evtl. kritisch werdender Ausführungszeit sind sie nun 
mal ein wenig anspruchsvoller als die Makros.

Übrigens habe ich in letzter Zeit öfters genau diese Anfrage in Foren 
gesehen, z.B. bei Keil, natürlich ebenfalls ohne Reaktion. Aber zu 
dieser Zeit war es mein Problem auch noch nicht.

Habe nur keine Ahnung, warum man ausgerechnet im Hause ARM selbst den 
Programmierern das Leben schwer machen will, hardwarenahe bzw. kernnahe 
Programmierung per Inline Assembly verhindert, das ist doch elementar 
wichtig. Als wenn man sonst nicht schon genug zu tun hätte! Im RealView 
"Compiler and Libraries Guide" gibt es Hinweise wie "Legacy inline 
assembler that accesses sp, lr, or pc", also das funktionierte in der 
Vergangenheit schon mal.

Grüße

DW

von Daniel (Gast)


Lesenswert?

Hallo,

bei mirr funktioniert es leider nicht mit dem inline asm. Ich verwende 
auch RealView mit LPC2364 Es kommen folgende Meldungen:

: Error #20 SP" is undefined
        STMFD   SP!, {R0}       ; sichere R0 auf IRQ Stack
                ^
: Warning #1287-D instruction may be expanded
        STMFD   SP!, {R0}       ; sichere R0 auf IRQ Stack
        ^
: Warning #1267-D: Imlicit physical register R0 should be defined as a 
variable
        STMFD   SP!, {R0}       ; sichere R0 auf IRQ Stack
                      ^
: Error #549: variable "R0" is used before its value is set
        STMFD   SP!, {R0}       ; sichere R0 auf IRQ Stack
                      ^
...

Kann mir jemand bitte helfen?
Danke

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.