1.异常处理和中断处理的异同:
不同点:
(1)都需要保存现场和恢复现场;
(2)都包括模式的切换;
(3)都必须进行相应模式的堆栈SP初始化。
相同点:
(1)异常是ARM核的行为,中断处理是SoC的行为。
(2)中断要设置中断控制器的寄存器,异常不用关心。
(3)中断要设置CPSR的I位为允许,异常不用管。
(4)中断处理程序中,ISR需要对PND寄存器进行清除操作,为了不重复响应中断,异常不用管。
(5)中断需要设置中断源的工作模式,异常不用管。
(6)SWI异常跳转到0x8,IRQ中断跳转到0x18。
(7)中断asm_handler中,需要对lr寄存器进行 减4 操作。swi异常处理没有。
2.中断处理的初始化工作包括哪些?
(0)在汇编中,需要初始化堆栈。(包括SVC模式和IRQ模式)
(1)设置中断源的中断方式(下降沿还是上升沿触发中断?EXTINT0)
(2)设置中断源的请求为 使能(有效)(IRQ enable -- GPIO控制器)
(3)设置中断源的中断模式为 IRQ 还是 FIQ (INTMOD 中断模式寄存器)
(4)设置中断屏蔽寄存器,设置屏蔽位(INTMSK 中断屏蔽寄存器)
(5)设置PND寄存器,所有bit位清0 (PND寄存器)。
(6)打开CPSR寄存器的I位,ARM内核允许中断。
(7)在0x18处设置好相应的跳转指令,以便中断发生后能进入正确的handler入口。(C语言在前面要加_irq,如_irq void handler(void)。)
3.akae2440板子的GPIO中断驱动有何特殊之处?
(1)首先设置GPIO的控制器,设置相关位为输入输出。(把GPB8、GPB9设置为输出)
(2)其次设置GPB8=0,GPB9=1;
(3)再次设置为下降沿(1到0跳变)触发中断;
(4)最后使能外部中断,External INT0。
4.s3c2440中断控制器中的PND寄存器有何特殊之处?
(1)PND寄存器和3个寄存器相关,SRCPND,INTPND,INTMSK;
(2)如果有1个中断到来,SRCPND相应位被置1,通过判断INTMSK屏蔽寄存器相应的位有没有被位置,1表示屏蔽,0表示允许能过。如果被屏蔽,则INTPND不被置位,SRCPND相应位仍被置1,如果没有屏蔽,则INTPND被置1。
(3)PND寄存器属于状态类的寄存器,但它又是可以写入的,所以它的操作原则和其它寄存器不一样,表现为“写1清0”,其他操作无影响。
(4)SRCPND要先清除,然后清除INTPND,这是因为SRCPND是根,INTPND是草,清除的时候,表现为要“斩草除根”,要先除根SRCPND。
(5)如果2个PND不清除,则重复不断响应中断,如果不及时清除,则会可能丢失处理过程中发生的同类中断。如果不按顺序清除,则表现为多1次中断。
阅读(1640) | 评论(0) | 转发(0) |