在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()中处理,而是在原设计上
"加高一层",以增强防御能力...
纸上谈兵,个人意见...
打赏帖 | |
---|---|
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 |