This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Nested Interrupts

Hello everybody,
I'm using LPC2148 ARM7, programming with uVision3.

Now, I need nesting Interrupts. Following lines were used:

                AREA    NESTED_IRQ, CODE, READONLY
                ARM

                                EXPORT  nested_irq_enable
                                EXPORT  nested_irq_disable



nested_irq_enable                       ; Nested Interrupts Entry:

                                MRS             LR, SPSR
                                STMFD   SP!, {LR}
                                MSR             CPSR_c, #0x1F
                                STMFD   SP!, {LR}



nested_irq_disable                      ; Nested Interrupts Exit:

                                ldmfd   sp!, {lr}
                                msr             cpsr_c, #0x92
                                ldmfd   sp!, {lr}
                                msr             spsr_cxsf, lr


;/*****************************************************************************/

                END

Now, my Controller runs always in Prefetch Abort Handler. Does anybody know this problem?
Or does anybody see what I'm doing wrong?

Thanks for all Replys, Adrian

Parents
  • I never tested this code:

    void __asm enable_nested_interrupts(void)
    {
        MOV     R0, LR
    
        MRS     LR, SPSR                ; Copy SPSR_irq to LR
        PUSH    {LR}                    ; Save SPSR_irq
        MSR     CPSR_c, #0x1F           ; Enable IRQ (Sys Mode)
        PUSH    {LR}                    ; Save LR
    
        MOV     LR, R0
    
        BX LR
    }
    
    void __asm disable_nested_interrupts(void)
    {
        MOV     R0, LR
    
        POP     {LR}                    ; Restore LR
        MSR     CPSR_c, #0x92           ; Disable IRQ (IRQ Mode)
        POP     {LR}                    ; Restore SPSR_irq to LR
        MSR     SPSR_cxsf, LR           ; Copy LR to SPSR_irq
    
        MOV     LR, R0
    
        BX LR
    }
    

Reply
  • I never tested this code:

    void __asm enable_nested_interrupts(void)
    {
        MOV     R0, LR
    
        MRS     LR, SPSR                ; Copy SPSR_irq to LR
        PUSH    {LR}                    ; Save SPSR_irq
        MSR     CPSR_c, #0x1F           ; Enable IRQ (Sys Mode)
        PUSH    {LR}                    ; Save LR
    
        MOV     LR, R0
    
        BX LR
    }
    
    void __asm disable_nested_interrupts(void)
    {
        MOV     R0, LR
    
        POP     {LR}                    ; Restore LR
        MSR     CPSR_c, #0x92           ; Disable IRQ (IRQ Mode)
        POP     {LR}                    ; Restore SPSR_irq to LR
        MSR     SPSR_cxsf, LR           ; Copy LR to SPSR_irq
    
        MOV     LR, R0
    
        BX LR
    }
    

Children