2.中断处理程序

  1. 回顾裸机的流程。在裸机下学期,通过按键玩中断。

    裸机中断的过程:

  2. 中断会有统一的入口:当我们的程序产生中断的时候,无论是哪种中断。都会跳到中断向量表里的_irq这里。这是统一的入口。

    2.用户要先注册中断处理程序。

    3.根据中断源编号,调用中断处理程序。

    接下来我们来看linux的中断,是不是也是这种模式的呢?

    我们打开内核工程的entry-armv.S这个文件,在这个文件里有这样的代码:

     

    这就是linux统一的入口:__irq svc.

    进入了统一的入口之后,程序会去调用irq_handler:

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

     

    在这个中断处理程序中。最重要的是get_irqnr_and_base获取产生中断的中断源。我们搜一下这个宏,会处理很多。这里我们以24XX的为例:

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

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

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

    在这个函数里又会去调用desc这个结构。

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

    图1

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

     

     

     

    共享中断号,如我们的图1的0号中断,在结构irq_desc里有多个处理程序。当中断产生的时候,所以的函数会去执行一遍。这样就要求我们在写程序的时候有一个判断,判断是否产生中断了。产生了就执行这函数,没产生就退出该函数。

     

     

     

     

     

    流程:

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

     

     

     

     

     

     

     

     

     

原文地址:https://www.cnblogs.com/FORFISH/p/5188558.html