Witam,
Moje pierwsze starcie z asemblerem na ARM i przerwaniami ...
Mam taki kawałek kodu
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.
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, #0x00000004i 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.