mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2000 nested Interrupts /Realview: wie kann ich die Functions nested_irq_enable in C-code aufrufen


Autor: Benoit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, liebe Mikrocontroller-Gemeinde,

Der ARM RealView-Kompiler verhindert konsequent, in Inline Assembly die 
physikalischen Register zu benutzen.
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:
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    */   \

Ich habe eine Lösung in diesem forum gefunden und sieht folgendermassen 
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
======================================================================== 
==
Kann mir jemand sagen wie kann ich die nested_irq_enable-Funktion und 
nested_irq_disable-Funktion in C-code aufrufen?
Ich bitte euch um ein kleines Beispielcode.

Danke im Voraus.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein anderer Ansatz, nested IRQs zuzulassen, besteht in einem zentralen 
Wrapper um die Vektoren. Also nicht im IRQ-Einsprung gleich zum Vektor 
weiterspringen, sondern zu ein bischen Assembler-Code, der die 
Verwaltung der Register und des VIC vornimmt und seinerseits den Vektor 
aufruft. Das hat zusätzlich den Charme, dass die eigentlichen 
Interrupt-Handler ganz normale C-Funktion sein dürfen und auch die 
abschliessende Quittierung beim VIC schon erledigt wird.

In manchen Startups ist so etwas schon drin (z.B. Crossworks).

Wenn man das richtig macht, dann dürfen bei dieser Methode die Handler 
auch Thumb-Funktionen sein.

Autor: Benoit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke A.K. für deine Antwort, aber ich komme trotzdem nicht weiter. 
Liegt irgendwo ein Beispielcode für das andere Ansatz ?

Autor: Benoit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand hat eine Idee wie kann ich die  nested_irq_enable-Funktion und
nested_irq_disable-Funktion in C-code aufrufen?
Ich bitte euch um ein kleines Beispielcode.

Danke im Voraus.

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.