logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[asembler][przerwania][LPC2468] Nie mogę wyczyścić przewania

nenpa8lo 28 Cze 2010 14:04 876 0
REKLAMA
  • #1 8239799
    nenpa8lo
    Poziom 17  
    Posty: 260
    Pomógł: 15
    Witam,

    Moje pierwsze starcie z asemblerem na ARM i przerwaniami ...

    Mam taki kawałek kodu
    tmr0_irq
                        stmdb   r13!, {r0-r4, r12, r14}
    
    
                        ldr     r0, =TMR0_BASE
                        ldr     r1, =TMR0_RST
                        str     r1, [r0, #TMR0_TCR_OFS]                                       ; Reset timer0.
                        
                        ldr     r0, =FIO_BASE
                        ldr     r1, [r0, #FIO2SET_OFS]                                        ; Read content of set register.
                        ldr     r2, =LED
                        mov     r3, #&1000000
                        cmp     r1, r2                                                        ; Check if toggle is needed.
                        bne     led_set
                        
    led_clr
                        str     r2, [r0, #FIO2CLR_OFS]
                        b       exit_irq
                        
    led_set
                        str     r2, [r0, #FIO2SET_OFS]                    
                       
    exit_irq
                        ldr     r0, =0
                        str     r0, [r0, #-0x0100]                                            ; Write to VICAddr to clear IRQ.
    
                        ldmia   r13!, {r0-r4, r12, r14}
                        subs    pc, r14, #0x00000004


    i niestety zaraz po wyjściu z przerwania ląnduję w 0x00000018 LDR PC, [PC, -#0x0120]. Poza tym jak czyszczę zawartość rejestru VICAddr (0xFFFFFF00) to nie widzę jako by się zmieniała, czego wynikiem jest natychmiastowe lądowanie w tym samym przerwaniu.
    Przy wejściu w przerwanie wyłączam timer0, żeby się upewnić że to nie on generuje przerwania (zresztą policzony jest na 500ms). Podpatrywałem też kod w 'disassembly file' (dla przykładu) i nie jestem w stanie określić dlaczego ten kod nie działa.
    Zapisywanie rejestrów na stosie przy wejściu do przerwania nie powinno mieć miejsca w moim przypadku ponieważ program główny to while(1); zrobiłem je dla świętego spokoju.
  • REKLAMA
REKLAMA