朱老师笔记
1.8.7.1、VICnINTENABLE和VICnINTENCLEAR
(1)VICnINTENABLE 对应interrupt enable,INTENCLEAR对应interrupt enable clear(2)INTENABLE寄存器负责相应的中断的使能,INTENCLEAR寄存器负责相应的中断的禁止。
(3)当我们想使能(意思就是启用这个中断,意思就是当硬件产生中断时CPU能接收的到)某个中断时,只要在这个中断编号对应的VICnINTENABLE的相应bit位写1即可(注意这个位写1其他位写0对其他位没有影响);如果我们想禁止某个中断源时,只要向VICnINTENCLEAR中相应的位写1即可。
注意:这里的设计一共有2种:有些CPU是中断使能和禁止是一个寄存器位,写1就使能写0就进制(或者反过来写1就进制写0就使能),这样的中断使能设计就要非常小心,要使用我们之前说过的读改写三部曲来操作;另一种就是使能和禁止分开为2个寄存器,要使能就写使能寄存器,要禁止就写禁止寄存器。这样的好处是我们使能/禁止操作时不需要读改写,直接写即可。
1.8.7.2、VICnINTSELECT
(1)设置各个中断的模式为irq还是fiq。一般都设置成irq
(2)IRQ和FIQ究竟有何区别。210中支持2种中断,irq和fiq。irq是普通中断,fiq是快速中断。快速中断提供一种更快响应处理的中断通道,用于对实时性要求很高的中断源。fiq在CPU设计时预先提供了一些机制保证fiq可以被快速处理,从而保证实时性。fiq的限制就是只能有一个中断源被设置为fiq,其他都是irq。
(3)CPU如何保证fiq比irq快?有2个原因:第一,fiq模式有专用的r8~r12,因此在fiq的isr中可以直接使用r8-r12而不用保存,这就能节省时间;第二,异常向量表中fiq是最后一个异常向量入口。因此fiq的isr不需要跳转,可以直接写在原地,这样就比其他异常少跳转一次,省了些时间。
1.8.7.3、VICnIRQSTATUS和VICnFIQSTATUS
(1)中断状态寄存器,是只读的。当发生了中断时,硬件会自动将该寄存器的对应位置为1,表示中断发生了。软件在处理中断第二阶段的第一阶段,就是靠查询这个寄存器来得到中断编号的。
1.8.7.4、VICnVECTPRIORITY0~VICnVECTPRIORITY31
(1)中断优先级设置寄存器,设置多个中断同时发生时先处理谁后处理谁的问题。一般来说高优先级的中断可以打断低优先级的中断,从而嵌套处理中断。当然了有些硬件/软件可以设置不支持中断嵌套。
1.8.7.5、VICnVECTADDR0~VICnVECTADDR31、VICnADDR
(1)这三个寄存器和210中断处理第二阶段的第二阶段有关。
(2)VICnVECTADDR0到31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,程序员在设置中断的时候,把这个中断的isr地址直接放入这个中断对应的VECTADDR寄存器即可。
(3)VICnADDR这个寄存器是只需要读的,它里面的内容是由硬件自动设置的。当发生了相应中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,然后将其读出复制到VICnADDR中,供我们使用。这样的设计避免了软件查找中断源和isr,节省了时间,提高了210的中断响应速度。
《朱老师物联网大讲堂》学习笔记
学习地址:www.zhulaoshi.org
中断相关的寄存器
VICnINTENABLE
也就是interrupt enable,负责相应中断的使能,
VICnINTENCLEAR
也就是interrupt enableclear,负责相应中断的禁止。
有些CPU上面两个功能是用一个寄存器实现的,
这样的话中断使能要小心,
对它们的操作,要像操作cp15寄存器一样,
通过读,改,写来完成。
VICnINTSELECT
设置为irq或者fiq,一般设置为irq。
irq和fiq有什么区别?
irq是普通中断,fiq是快速中断,
fiq有更快的中断响应通道,但是只能有一个被设置为fiq。
VICnINTSELECT
设置为irq或者fiq,一般设置为irq。
irq和fiq有什么区别?
irq是普通中断,fiq是快速中断,
fiq有更快的中断响应通道,但是只能有一个被设置为fiq。
CPU如何保证fiq比irq快啊?
1.fiq模式有专用的r8~r12,可以直接使用,不像其它模式,还要保存寄存器,
2.fiq的中断处理程序直接在异常向量表中,因为它是异常向量表中最后一个异常。
VICnIRQSTATUS和VICnFIQSTATUS
中断状态寄存器,是只读的,当发生中断时,硬件会自动将该位的寄存器置为1,表示中断发生,
软件在处理第二阶段第一阶段适时,就是靠查询这个寄存器来得到中断编号的。
VICnVECTPRIORITY0~VICnVECTPRIORITY31
中断优先级设置寄存器,设置多个中断同时发生时先处理谁后处理谁得问题,
一般来说高优先级的中断,可以打断低优先级的中断,从而嵌套中断,
不过也可以设置不支持嵌套中断。
VICnVECTADDR0~VICnVECTADDR31,VICnADDR
一共有32*4+4个寄存器,
210的寻找isr的机制,就是通过这些寄存器来实现的,
每一个中断源都有一个VECTADDR寄存器,把中断ISR地址直接放入这个寄存器接口即可,
VICnADDR这个寄存器是只读的,只需要读的,里面的内容是由硬件自动设置的,
当发生了相应的中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,
然后将其读出复制到VICnADDR中,我们直接读出使用即可。
通过硬件实现,避免了软件查找中断源和ISR,提高了响应速度。