2.中断处理程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是指中断里的第几个函数,要注销的。

     

     

     

     

     

     

     

     

     

以上是关于2.中断处理程序的主要内容,如果未能解决你的问题,请参考以下文章

2.中断处理程序

用于数据加载的 Android 活动/片段职责

Linux(内核剖析):23---中断下半部之(下半部总体概述)

非常好!!!Linux源代码阅读——中断

GIC驱动程序对中断的处理流程

13.linux中断处理程序