====================================================================
start.s
Vector_Table:
[0x00] B Reset_GO;
[0x04] LDR PC, Undefined_Addr;
[0x08] LDR PC, SWI_Addr;
[0x0C] LDR PC, Prefetch_Addr;
[0x10] LDR PC, Abort_Addr;
[0x14] DCD 0x0;
[0x18] LDR PC, IRQ_Addr;
[0x1C] LDR PC, FIQ_Addr;
[0x20] Reset_Addr DCD Reset_GO
[0x24] Undefined_Addr DCD Undefined_Handler
[0x28] SWI_Addr DCD SWI_Handler
[0x2C] Prefetch_Addr DCD Prefetch_Handler
[0x30] Abort_Addr DCD Abort_Handler
[0x34] DCD 0
[0x38] IRQ_Addr DCD IRQ_Handler
[0x3C] FIQ_Addr DCD FIQ_Handler
.......
====================================================================
因此安装中断处理程序可以这样写:
__irq void sysIrqHandle(void) {
u32 volatile _mIPER, _mISNR;
_mIPER = (inpw(REG_AIC_IPER) >> 2) & 0x3F;
_mISNR = inpw(REG_AIC_ISNR);
if (_mISNR != 0) {
if (_mIPER == _mISNR) {
(*sysIrqHandlerTable[_mISNR])();
}
}
outpw(REG_AIC_EOSCR, 1);
}
__irq void sysFiqHandle(void) {
u32 volatile _mIPER, _mISNR;
_mIPER = (inpw(REG_AIC_IPER) >> 2) & 0x3F;
_mISNR = inpw(REG_AIC_ISNR);
if (_mISNR != 0) {
if (_mIPER == _mISNR) {
(*sysFiqHandlerTable[_mISNR])();
}
}
outpw(REG_AIC_EOSCR, 1);
}
void sysInitializeAIC(void) {
*(unsigned int volatile *)0x38 = (unsigned int)sysIrqHandler;
*(unsigned int volatile *)0x3C = (unsigned int)sysFiqHandler;
}