• 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是指中断里的第几个函数,要注销的。

       

       

       

       

       

       

       

       

       

  • 相关阅读:
    Matplotlib 使用
    谈谈 JavaScript 的正则表达式
    Sequelize 学习笔记(11)- Migrations 迁移
    影响 POST 请求文件上传失败的几个环节的配置(php + nginx)
    安装 composer 并启动 yii2 项目
    机器学习初探
    如何深拷贝一个对象数组?
    断舍离 ——《代码整洁之道》读书笔记
    moment.js 学习笔记
    postgres Date/Time 学习笔记
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188558.html
Copyright © 2020-2023  润新知