eboot中的中断处理

 

 
6410BSP中的EBOOT支持USB中断,类似的我们也可以接管其他的中断。
不过一开始对接管中断的方式搞不太懂,void InitializeInterrupt(void)中:
#define DRAM_BASE_PA_START            (0x50000000)
#define pISR        (*(volatile unsigned *)(DRAM_BASE_PA_START+0x18))
pISR = (unsigned)(0xEA000000)+(((unsigned)ASM_IsrHandler -(DRAM_BASE_CA_START + 0x18 + 0x8))>>2);

pISR对应从DRAM起始地址开始的0x18(24)字节处,每指令4字节,所以这个地址为第7个中断向量,即IRQ.
0xEA000000为ARM跳转指令。
ARM是3级流水线,即pc-2是执行指针,pc-1是译码指针,pc为取指指针。所以(DRAM_BASE_CA_START + 0x18 + 0x8)是执行IRQ跳转时的PC值(0x8 = 2*4),用自己的ISR地址减去此PC然后除以4,就得到了跳转地址。

你可能感兴趣的:(eboot中的中断处理)