注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

linux-3.4.2中断机制分析——asm_do_IRQ  

2012-09-10 03:36:47|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
     handle_IRQ(irq, regs);
           generic_handle_irq(irq);
                 //#define irq_to_desc(irq) (&irq_desc[irq])
                 //根据中断号在数组irq_desc中找到一项
                 struct irq_desc *desc = irq_to_desc(irq);
                 generic_handle_irq_desc(irq, desc);
                       desc->handle_irq(irq, desc)
在系统初始化的时候会调用:
arch_initcall(s3c2440_irq_init);
       subsys_interface_register(&s3c2440_irq_interface);
static struct subsys_interface s3c2440_irq_interface = {
.name = "s3c2440_irq",
.subsys = &s3c2440_subsys,
.add_dev = s3c244x_irq_add,
};
s3c244x_irq_add
       irq_set_chip_and_handler(IRQ_NFCON, &s3c_irq_level_chip,handle_level_irq);
              irq_set_chip_and_handler_name(irq, chip, handle, NULL);
                      __irq_set_handler(irq, handle, 0, name);
                              desc->handle_irq = handle;
我们看到desc->handle_irq(irq, desc)实际就是执行handle_level_irq这个函数,我们继续跟踪
handle_level_irq(irq, desc) 
     handle_irq_event(desc);
            struct irqaction *action = desc->action;
            handle_irq_event_percpu(desc, action);
                  res = action->handler(irq, action->dev_id);
我们看到最终会执行到这个函数,显然action->handler肯定就指向我们注册的中断处理函数!

为了验证一下,我们从注册中断来进行分析:
request_irq(IRQ_EINT0,  buttons_irq, IRQT_BOTHEDGE, "S2",&pins_desc[0]);
     request_threaded_irq(irq, handler, NULL, flags, name, dev);
           struct irqaction *action;
           struct irq_desc *desc;
           desc = irq_to_desc(irq);// desc指向 irq_desc结构体中下表为irq的项
           action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);
           action->handler = handler;//我们的中断处理函数放在了action结构体里面
           __setup_irq(irq, desc, action);
                old_ptr = &desc->action;
                new->irq = irq;
                *old_ptr = new;//* desc->action = new ;
这样我们 desc->action就指向了我们设置的action结构体!

我们来总结一下:
irq_desc[]是一个指向irq_desc_t结构的数组,在注册中断的时候,会根据中断号找到数组中的某一项,并填充它!其中最主要的是action成员,action成员也是一个结构体,我们要将中断号和中断处理函数填充到action结构体里去!
在发生中断的时候,会根据中断号找到对应的irq_desc_t结构体,并执行其中的handle_irq函数,而这个函数在中断初始化的时候就指向了特定的函数handle_level_irq,这个函数最终会调用irq_desc_t结构体的action成员中的中断处理函数!
  评论这张
 
阅读(4014)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017