在Philips ARM的中断体系中,中断干扰应该主要侵入SWI,IRQ,FIQ这三个中断向量.
SWI比较好防御,但IRQ,FIQ确实很难防御...
但是FIQ的向量可以在编译时固定,虽然IRQ分支很多没定义VICVectAddrX或VICVectCntl未开放中断,但都会归入VICDefVectAddr.
这样我们就可以从FIQ_Handler()和DefaultIRQ()中拦截...
拦截模型: void FIQ_Handler (void) __fiq {//VICIntSelect非0 unsigned temp; temp = VICFIQStatus; if (temp & (1 << VICIntSel_EINT0)) { IOPIN1 ^= (1 << P1_16); //取反P1.16 EXTINT = (1 << EINT0); //清除INT0中断标志 } else if (temp & (1 << VICIntSel_EINT1)) { IOSET1 = (1 << P1_17); //P1.17=1 while(EXTINT & (1 << EINT1)) { EXTINT = (1 << EINT1); //清除INT1中断标志 } IOCLR1 = (1 << P1_17); //P1.17=0 } else if (temp & (1 << VICIntSel_EINT2)) { IOPIN1 ^= (1 << P1_18); //取反P1.18 EXTINT = (1 << EINT2); //清除INT2中断标志 } else if (temp & (1 << VICIntSel_EINT3)) { IOPIN1 ^= (1 << P1_19); //取反P1.19 EXTINT = (1 << EINT3); //清除INT3中断标志 } else {//其他干扰源 //再次填入干扰处理代码 } VICSoftIntClr = temp;//抗击无效VICSoftInt=XXX的入侵 VICVectAddr = 0; }
void DefaultIRQ (void) __irq {//VICIntSelect=0且VICVectCntl0~VICVectCntl15都未中断使能 unsigned long temp; temp = VICIRQStatus; if (temp & (1 << VICIntSel_EINT0)) { IOPIN1 ^= (1 << P1_16); //取反P1.16 EXTINT = (1 << EINT0); //清除INT0中断标志 } else if (temp & (1 << VICIntSel_EINT1)) { IOPIN1 ^= (1 << P1_17); //取反P1.17 while(EXTINT & (1 << EINT1)) { EXTINT = (1 << EINT1); //清除INT1中断标志 } } else if (temp & (1 << VICIntSel_EINT2)) { IOPIN1 ^= (1 << P1_18); //取反P1.18 EXTINT = (1 << EINT2); //清除INT2中断标志 } else if (temp & (1 << VICIntSel_EINT3)) { IOPIN1 ^= (1 << P1_19); //取反P1.19 EXTINT = (1 << EINT3); //清除INT3中断标志 } else {//其他干扰源 //再次填入干扰处理代码 } VICSoftIntClr = temp;//抗击无效VICSoftInt=XXX的入侵 VICVectAddr = 0; }
我并非主张将中断都在FIQ_Handler()和DefaultIRQ()中处理,而是在原设计上
"加高一层",以增强防御能力...
纸上谈兵,个人意见...
发表此说并非说ARM不如MCU抗打击,而是想如何去面对现实...
|