zoukankan      html  css  js  c++  java
  • 13.linux中断处理程序

            linux中断处理程序

    一、中断处理流程

    在linux内核代码中进入entry-armv.S目录: 

      

      linux统一的入口:__irq svc.

      进入了统一的入口之后,程序跳到irq_handler标号(在同一个文件上面有说明):

      

      而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面。

      

      在这个中断处理程序中。最重要的是get_irqnr_and_base获取产生中断的中断源,搜索这个宏。这里以2410的为例(竟然没有找到6410):

      

      从上面的程序看到。他主要是获取产生中断的中断号。获得中断号后,会跳转到:arch_irq_handler_defualt里的asm_do_IRQ去处理中断:

      

      跳转到这个函数之后,又会去调用generic_handle_irq(irq)这个函数:

      

      这个函数又会去调用generic_handle_irq_desc这个函数:

      

      在这个函数里又会去调用desc这个结构,这里的handle_irq是个函数指针

      总结:在linux里:当产生中断的时候,会有一个统一的入口,irq_svc.进来之后,第一步是拿到产生中断源的编号,然后根据这个中断号去找到irq_desc这个结构。然后在这个结构里取出事先准备好的注册处理函数。

      我们的驱动要支持中断处理,首先必须去实现中断处理程序。第二是要注册中断处理函数。

    二、中断处理程序设计

      

    2.1中断注册

    request_irq函数用于注册中断。

    int request_irq(unsigned int irq, void(*handler)(int, void*, struct pt_regs *), unsigned long flags, const char*devname, void*dev_id)

      返回0表示成功,或者返回一个错误码

      unsigned int irq中断号。

      void (*handler)(int,void *)中断处理函数。

       unsigned long flags与中断管理有关的各种选项

    在flags参数中,可以选择一些与中断管理有关的选项,如:
    IRQF_DISABLED(SA_INTERRUPT)
      如果设置该位,表示是一个“快速”中断处理程序;
      如果没有设置这位,那么是一个“慢速”中断处理程序。
    IRQF_SHARED(SA_SHIRQ)
      该位表明该中断号是多个设备共享的。

      const char * devname  设备名

      void*dev_id共享中断时使用。

      快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。

    2.2中断处理程序

      中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:

    1.不能使用可能引起阻塞的函数
    2.不能使用可能引起调度的函数

      

    3.3中断注销

    当设备不再需要使用中断时(通常在驱动卸载时), 应当把它们注销, 使用函数:

      void free_irq(unsigned int irq, void*dev_id)

     Dev_id是指中断里的第几个函数,要注销的。

  • 相关阅读:
    HTML DOM 12 表格排序
    HTML DOM 10 常用场景
    HTML DOM 10 插入节点
    HTML DOM 09 替换节点
    HTML DOM 08 删除节点
    HTML DOM 07 创建节点
    022 注释
    024 数字类型
    005 基于面向对象设计一个简单的游戏
    021 花式赋值
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5360269.html
Copyright © 2011-2022 走看看