www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2378 und TN-Kernel


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe den TNKernel ein wenig abgeändert, so dass ich Interrupts über 
den VIC leiten kann (Im Original muß man ja alles in eine riesige ISR 
packen).
Leider läuft es nur, wenn der Compiler (IAR) ARM Instructions erzeugt. 
Im Thumb Modus stürzt er ab. Ich nehme an, es liegt an einer geänderten 
Assembler-Funktion:
tn_cpu_irq_isr:

     sub    lr, lr, #4              ; Set lr to the actual return address
     stmfd  sp!, {r0-r12, lr}       ; save all registers

     ldr    r2, =tn_int_counter
     ldr    r3, [r2]                ; interrupt_counter -> r3
     add    r0, r3,#1               ; interrupt_counter++
     str    r0, [r2]

     //LDR     R0,=tn_cpu_irq_handler
     LDR     R0,=tn_tick_int_processing
     MOV     LR, PC
     BX      R0

     ; interrupt_counter--

     ldr    r2, =tn_int_counter
     ldr    r1, [r2]
     sub    r3, r1,#1
     str    r3, [r2]
     cmp    r3, #0x00               ; if it is nested int - return
     bne    exit_irq_int            ; return from int
     ldr    r0, =tn_context_switch_request  ; see if we need to do a context switch
     ldr    r1, [R0]
     cmp    r1, #0                  ; if 0 - return
     beq    exit_irq_int
     mov    r1, #0                  ; else - clear req flag and  goto context switch
     str    r1, [r0]
     b      tn_int_ctx_switch

exit_irq_int:

     // Clear timer 0 interrupt
     ldr  r0, =1
     ldr  r3, =T0IR
     str  r0, [r3]

     // Acknowledge VIC
     ldr  r0, =0
     ldr  r3, =VICVECTADDR
     str  r0, [r3]

     ldmfd  sp!, {r0-r12, pc}^      ; exit

  ;---------------------------------------------------------------------------

tn_int_ctx_switch:

  ; Our target - get all registers of interrrupted task, saved in IRQ's stack
  ; and save them in the interrupted task's stack


     mrs    r0, spsr                  ; Get interrupted task's CPRS
     stmfd  sp!, {r0}                 ; Save it in the IRQ stack
     add    sp, sp, #4                ; Restore stack ptr after CPSR saving
     ldmfd  sp!, {r0-r12, lr}         ; Put all saved registers from IRQ
                                      ;   stack back to registers
     mov    r1, sp                    ; r1 <-  IRQ's SP
     sub    r1,r1,#4
     msr    cpsr_c, #(NOINT | SVCMODE) ; Change to SVC mode; INT are disabled

   ; Now - in SVC mode; in r1 - IRQ's SP

     ldr    r0, [r1], #-14*4    ; r0 <- task's lr (instead pc)+ rewind stack ptr
     stmfd  sp!, {r0}
     stmfd  sp!, {r2-r12, lr}   ; Save registers in interrupted task's
                                ;  stack,except CPSR,r0,r1
     ldr    r0, [r1],#2*4       ; Get interrupted task's CPSR (pos 0(-15))
     ldr    r2, [r1],#-4        ; Get valid r1 to save (pos 2(-13))
     ldr    r1, [r1]            ; Get valid r0 to save (pos 1(-14))
     stmfd  sp!, {r0-r2}        ; Save r0, r1, and CPSR

  ; Registers has been saved. Now - switch context

     ldr    r0, =tn_curr_run_task
     ldr    r0, [r0]
     str    sp, [r0]               ; SP <- curr task

     ldr    r0, =tn_next_task_to_run
     ldr    r2, [r0]
     ldr    r0, =tn_curr_run_task
     str    r2, [r0]
     ldr    sp, [r2]

  ; Return

     // Clear timer 0 interrupt
     ldr  r0, =1
     ldr  r3, =T0IR
     str  r0, [r3]

     // Acknowledge VIC
     ldr  r0, =0
     ldr  r3, =VICVECTADDR
     str  r0, [r3]

     ldmfd  sp!, {r0}                  ; Get CPSR
     msr    spsr_cxsf, r0              ; SPSR <- CPSR
     ldmfd  sp!, {r0-r12, lr, pc}^     ; Restore all registers, CPSR also

Die Funktion wird beim VIC als ISR für Timer 0 angemeldet und macht die 
Context Switches. Sie ruft eine C-Funktion auf (tn_tick_int_processing), 
die dann ja Thumb Code wäre. Ich habe schon versucht, 
tn_tick_int_processing als __arm zu deklarieren, hat aber leider nichts 
geholfen.
Hat jemand eine Idee?

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.