Добрый день.
В стартуп файле сделал:
Код
irq_handler_address: .word 0x40000018 /* cpu_irq_isr */
fiq_handler_address: .word 0x4000001C /* cpu_fiq_isr */
В мейне сделал так:
Код
#define IRQ_RAM_ADDR 0x40000018
#define FIQ_RAM_ADDR 0x4000001C
#define IRQ_RAM_FUNC_ADDR 0x40000038
#define FIQ_RAM_FUNC_ADDR 0x4000003C
MEMMAP = 0x01;//Interrupt vectors are not re-mapped and reside in Flash.
unsigned int * ptr;
//---- Set interrupts vectors
ptr = (unsigned int *)IRQ_RAM_ADDR;
*ptr = 0xE59FF018; //-- ldr pc, [pc, #24]
ptr = (unsigned int *)FIQ_RAM_ADDR;
*ptr = 0xE59FF018; //-- ldr pc, [pc, #24]
//--- Put IRQ & FIQ vectors in RAM
ptr = (unsigned int *)IRQ_RAM_FUNC_ADDR;
*ptr = (unsigned int)&cpu_irq_handler;
ptr = (unsigned int *)FIQ_RAM_FUNC_ADDR;
//*ptr = (unsigned int)&cpu_fiq_handler;
И определил:
Код
//----------------------------------------------------------------------------
void cpu_irq_handler(void)
{
int_func ifunc;
ifunc = (int_func)VICAddress;
if(ifunc != 0)
(*ifunc)();
}
При прерывании заходим в cpu_irq_handler(void) и прыгаем непосредственно в обработчик прерывания.
При выходе из обработчика прерывания мы прыгаем в dabort_handler.
Что не правильно в cpu_irq_handler()?