- 论坛徽章:
- 0
|
关于arm 中断的一点流程分析吧 很简略 主要是澄清自己前面的疑问 主要是偶水平比较菜
关于中断向量表那里就不说了,我没仔细看,直接从asm_do_IRQ开始
asm_do_IRQ->desc_handle_irq(irq,desc); -> desc->handle_irq(irq, desc) . 我的板子上网卡中断接的是EINT9,属于外部中断. 2440的EINT8 到 EINT23是共用一条
cpu内部中断线的(这里不知这样说合适不),这就相当于linux里面中断注册为IRQ_SHARED类似,来了一个中断,要查询具体是哪个中断.
include/asm/arch-s3c2410/irqs.h 在这个文件中定义了
从上面可以看出 如果EINT9来中断 应该是asm_do_IRQ接收到的是21号中断 然后再查询具体是哪个外部io来的中断 最后确定是53号中断,然后调用相应的irq action- #define S3C2410_CPUIRQ_OFFSET (16)
- #define S3C2410_IRQ(X) ((X) + S3C2410_CPUIRQ_OFFSET)
- ................
- #define IRQ_EINT8t23 S3C2410_IRQ(5) //计算一下 21
- ................
- #define IRQ_EINT9 S3C2410_IRQ(37) //这里是 53
复制代码 中断服务程序在哪里注册的呢?
arch/arm/mach-s3c2410/irq.c文件中的- s3c24xx_init_irq() ->
- | ->
- set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint8); //这里注册的s3c_irq_demux_extint8 就是当21号中断来的时候要调用的
- |->
- for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {//这个循环的作用的注册 共享21号中断的 各个具体引脚的中断服务程序
- irqdbf("registering irq %d (extended s3c irq)\n", irqno);
- set_irq_chip(irqno, &s3c_irqext_chip);
- set_irq_handler(irqno, handle_edge_irq); //如果EINT9上发生中断 最后调用的是这个handle_edge_irq
- set_irq_flags(irqno, IRQF_VALID);
- }
复制代码 再来看一下handle_edge_irq->handle_IRQ_event 最终调用驱动程序中注册的irq action handler 我的cs89x0中是net_interrupt函数 |
|