以S3C24XX为例:
根据中断入口跳转方法的不同,中断可分为向量中断和非向量中断。采用向量中断的CPU通常为不同的中断分配不同的中断号,当检测到某中断号中断到来后,就自动跳转到与该中断号对应的地址执行。不同的中断号的中断有不同的入口地址。非向量中断的多个中断共享一个入口地址,进入该入口地址后,再通过软件判断中断标志来识别具体是哪个中断。
也就是说,向量中断由硬件提供中断服务程序的入口地址,非向量中断由软件提供中断服务程序入口地址。
-------------------------------------------------------------------------------
asm_do_IRQ为中断的C语言入口函数:
asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
struct irq_desc *desc = irq_desc + irq;
/*
* Some hardware gives randomly wrong interrupts. Rather
* than crashing, do something sensible.
*/
if (irq >= NR_IRQS)
desc = &bad_irq_desc;
irq_enter();
desc_handle_irq(irq, desc);
/* AT91 specific workaround */
irq_finish(irq);
irq_exit();
set_irq_regs(old_regs);
}
-------------------------------------------------------------------------------
其中,desc_handle_irq函数调用desc 结构中的handle_irq成员函数,它就是irq_desc[irq].handle_irq。
另外,asm_do_IRQ函数中参数irq的取值范围为(IRQ_EINT0~IRQ_ADCPARENT),共有32个取值。它可能对应一个实际的中断号, 也可能是一组中断的中断号,这是由芯片的特性决定的。
发生中断时INTPND