免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2240 | 回复: 0
打印 上一主题 下一主题

2440中断流程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-24 14:37 |只看该作者 |倒序浏览
关于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
  1. #define S3C2410_CPUIRQ_OFFSET (16)
  2. #define S3C2410_IRQ(X) ((X) + S3C2410_CPUIRQ_OFFSET)
  3. ................
  4. #define IRQ_EINT8t23  S3C2410_IRQ(5)  //计算一下 21
  5. ................
  6. #define IRQ_EINT9 S3C2410_IRQ(37)     //这里是    53
复制代码
中断服务程序在哪里注册的呢?
arch/arm/mach-s3c2410/irq.c文件中的
  1. s3c24xx_init_irq() ->
  2.         | ->
  3.         set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint8); //这里注册的s3c_irq_demux_extint8 就是当21号中断来的时候要调用的
  4.      |->
  5.         for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {//这个循环的作用的注册  共享21号中断的 各个具体引脚的中断服务程序
  6.                     irqdbf("registering irq %d (extended s3c irq)\n", irqno);
  7.                     set_irq_chip(irqno, &s3c_irqext_chip);
  8.                     set_irq_handler(irqno, handle_edge_irq); //如果EINT9上发生中断 最后调用的是这个handle_edge_irq
  9.                     set_irq_flags(irqno, IRQF_VALID);
  10.              }
复制代码
再来看一下handle_edge_irq->handle_IRQ_event 最终调用驱动程序中注册的irq action handler  我的cs89x0中是net_interrupt函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP