接着上篇,再继续讲,我们再看一下IRQ.被设置为IRQ的中断源是可以进行优先级设置的.
在中断源表中,32个中断源都可以被分配为IRQ,那么这些中断源同时到达的时候,先处理哪一个中断?因此不同的IRQ要被分配不同的优先级,而IRQ是,而已被分配(0~15)供16个优先级,其中0优先级最高,而15优先级最低.
当有多个中断请求被分配为IRQ时,VIC会将它们"相或"后,在向处理器发送IRQ信号.
要让外设的中断请求得到响应,需要进行初始化操作.其流程是这样的.
我们再讲一下IRQ中断请求响应的过程,看一下下面的图:
我们来叙述一下:
1.用户正在执行.
2.发送外部中断0中断
3.VIC硬件自动将中断服务程序地址装入到VICVectAddr寄存器中.例如将VICVectAddr14的内容装入到VICVectAddr寄存器中.
4.执行流转至向量表IRQ入口处.
5.在IRQ入口,读取VICVectAddr里的服务程序地址:LDR PC,[PC,#-0x120]
6.中断服务程序结束,继续执行被中断的用户代码.
FIQ优先级最高,响应最迅速,常用于处理系统中最重要紧急的中断事务.一般来说都是用于一些安全处理.FIQ之所以比较快,是因为ARM为FIQ设计了8个专用的寄存器,发送FIQ中断时这8个寄存器无需压站,这使得处理速度被大大提高,中断延迟被缩短.在主函数中使能FIQ中断,然后编写FIQ处理程序即可使用FIQ.下面给出一个FIQ在EInt0中断请求处理中的应用例子:
1.首先通过VICIntSelect选择EINT0的中断类型.
2.使能中断:VICIntEnable=1< 3.中断响应完成后,清楚中断标志并返回:EXTINT=0x01;//清除中断标志 可以将中断请求分配为向量IRQ.优先级也可以在16个中断优先级中进行选择,同时,也可以通过编程屏蔽任一优先级的向量IRQ.每一个中断源都有一个专门的中断优先级寄存器和向量地址寄存器. 1.选择中断类型 2.IRQ设置 3.清除中断标志 4.使能中断. T0IR=0x01//清除中断标志. VICVectAddr=0//通知VIC中断结束
每个通道对应着前一篇中的中断源表.下面以向量IRQ在定时器0中断请求处理内的应用为例来描述IRQ的操作.
中断响应完成后,还需要执行以下的操作:
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』