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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.