Página 1 de 1

interrupções re-entrantes

MensagemEnviado: 15 Ago 2007 12:03
por lrfad2
Pessoas,
Preciso aprender um pouco mais sobre interrupções re-entrantes no LPC2138. Bom achei no site da nxp um AN falando sobre isso (AN10381
Nesting of interrupts in the LPC2000)
O grande problema que quando tento fazer como no exemplo o meu MDK ARM (keil), alega que os registradores de link register (LR), stack pointer (SP), não existem. Error #20 indentifier `LR` is undefined
Já tentei inclusive trocar o SP por R13 e assim por diante.

A rotina do App note eh:
#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 */ \
// Macro for disabling interrupts, switching back to IRQ and relevant stack operations
#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 */ \

Como deu pau, segui o exemplo do keil e fiz o seguinte:
#define IENABLE { /*Nested Interrupts Entry */ \
__asm { MRS R14, 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 */ \
}

Alguem sabe o que tenho que fazer pra essa parada funcionar?
abracos

MensagemEnviado: 16 Ago 2007 20:59
por Viktor
Essa sequência de código é valida para o CARM (compilador abandonado pela KEIL) e não para o MDK ARM (compilador atual da KEIL).

MensagemEnviado: 27 Ago 2007 09:20
por lrfad2
é isso mesmo Viktor.
muito obrigado