VIC:
ARM有19个中断源,为其分配了0 - 18号VIC通道。
向量控制寄存器VICVectCntl0-15记录了各个通道号及其使能位。
当中断发生时,VICVectAddr0-15中的一个值会被copy到VICVectAddr.
如果是非向量中断则VICdefaultAddr被copy到VICVectAddr.
程序跳转到VICVectorAddr指向的地址。
中断返回时,写0x00到VICVectAddr.
非向量中断是指那些虽然已经打开(允许),但是没有在相应的VICVectorCntl0~15和VICVectorAddr0~15中设置的中断。
关于中断设置:
1、首先,硬复位后所有的Special
Function Registor都有默认值。不必考虑设置的顺序问题。可以先设置好中断,再开通模块功能。
2、软中断(SWI)与非向量中断不同,它的入口是0x0000,0008。进入软中断后,系统变为管理模式。而非向量中断入口是0x0000,0018。它引导系统进入fiq/irq模式。
3、VIC设置实例:
VICIntSelect = 0x00000000; //所有中断都是IRQ
VICVectCntl0 = 0x20 | 15; //EINT1为向量中断,使用Slot0
VICVectAddr0 = (uint32)EINT1_Exception;
//EINT1中断地址
VICDefVectAddr
= (uint32)Default_Entry; //非向量中断地址
VICIntEnable
= 0x00018000; //使能EINT1和EINT2
由于在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中只设置了EINT1,故EINT2中断发生时,要进入非向量中断处理程序Default_Entry。
关于优先级:
在调试C语言的多中断程序时,在中断中设断点,调了几个循环就全乱了。开始时怀疑编译器有问题,后来发现是Debugger不够好。
测试如下:
1、修改C
Compiler的优化级别为最低。重新编译。
2、令Timer0定时0.25秒中断,在中断中将Test++。
令EINT3(外部RTC)1秒中断,在中断中用LCD显示Test的值并将一个LED取反。然后再用软件延时,占据CPU0.9秒或0.5秒后才退出中断。
3、令Timer0的优先级小于EINT3。LED为1秒断续,LCD显示的Test值一秒加一。
4、令Timer0的优先级大于EINT3。LED为1秒断续,LCD显示的Test值一秒加一或加二或加四。
结论:Timer0中Test加一/加二/加四是在EINT3退出后的间隙中完成的。所以,IRQ中可能没有传说中的优先级机制。
关于Spurious
Interrupts:
见http://www.arm.com/support/faqip/3677.html的介绍。其中Solution1、2、3皆可行。当然,最好的办法是不要老是关中断。
在G18App的主循环中不断关闭/开启UART的中断以读取其缓冲区的长度及数据,出现以下现象:程序经常走进VICDefaultAddress!
解释:当UART中断产生时,Core
latches the IRQ status,此时,UART的中断被关闭。然后,Core
loads IRQ Address from VIC. the VIC will not be able to clearly identify the
interrupt that generated the interrupt request, and as a result the VIC will
return the default interrupt VICDefVectAddr.
文章评论(0条评论)
登录后参与讨论