это все делается через AIC
например заполняю слоты так
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (int) UsbIrqHandler;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (int) Timer0IrqHandler;
В единственном в ARM обработчике IRQ типа того
extern "C" __arm __irq void IrqHandler()
{
void (*pInterrupt)() = (void (*)())AT91C_BASE_SYS->AIC_IVR;
pInterrupt();
}
Немного неоптимально, что вектор IRQ зовет с-шную функцию перед распределением прерывания, но честно говоря лень было на асме все
В асмовом файле просто -
B InitReset ; 0x00 Resethandler
undefvec:
B undefvec ; 0x04 Undefined B swivec ; 0x08 Software
pabtvec:
B pabtvec ; 0x0C Prefetch
dabtvec:
B dabtvec ; 0x10 Data Abort
rsvdvec:
B rsvdvec ; 0x14 reserved
irqvec:
LDR PC, irqAddr
fiqvec: ; 0x1c FIQ
B FIQ_Handler_Entry
irqAddr:
DCD IrqHandler