首页 > 系统相关 >Linux中断管理

Linux中断管理

时间:2024-08-26 20:52:14浏览次数:6  
标签:函数 管理 中断 irq Linux tasklet 处理函数

Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中断处理函数即可,使用非常方便,不需要一系列复杂的寄存器配置。

1.Linux中断简介

中断号

每个中断都有一个中断号,通过中断号即可区分不同的中断,有的资料也把中断号叫做中断线。在 Linux 内核中使用一个 int 变量表示中断号

request_irq函数

在 Linux 内核中要想使用某个中断是需要申请的,request_irq 函数用于申请中断, request_irq函数可能会导致睡眠,因此不能在中断上下文或者其他禁止睡眠的代码段中使用 request_irq 函数。request_irq 函数会激活(使能)中断,所以不需要我们手动去使能中断,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

free_irq函数

使用中断的时候需要通过 request_irq 函数申请,使用完成以后就要通过 free_irq 函数释放掉相应的中断。如果中断不是共享的,那么 free_irq 会删除中断处理函数并且禁止中断
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中断处理函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

中断使能/禁止函数

暂时无法在中科创达软件股份有限公司文档外展示此内容
enable_irq 和 disable_irq 用于使能和禁止指定的中断,irq 就是要禁止的中断号。disable_irq函数要等到当前正在执行的中断处理函数执行完才返回,因此使用者需要保证不会产生新的中断,并且确保所有已经开始执行的中断处理程序已经全部退出。在这种情况下,可以使用另外一个中断禁止函数:
暂时无法在中科创达软件股份有限公司文档外展示此内容
disable_irq_nosync 函数调用以后立即返回,不会等待当前中断处理程序执行完毕。
有时候我们需要关闭当前处理器的整个中断系统,也就是在学习 STM32 的时候常说的关闭全局中断:
暂时无法在中科创达软件股份有限公司文档外展示此内容
local_irq_enable 用于使能当前处理器中断系统,local_irq_disable 用于禁止当前处理器中断系统。
暂时无法在中科创达软件股份有限公司文档外展示此内容
这两个函数是一对,local_irq_save 函数用于禁止中断,并且将中断状态保存在 flags 中local_irq_restore 用于恢复中断

2.上半部与下半部

我们在使用request_irq 申请中断的时候注册的中断服务函数属于中断处理的上半部,只要中断触发,那么中断处理函数就会执行。我们都知道中断处理函数一定要快点执行完毕,越短越好,但是现实往往是残酷的,有些中断处理过程就是比较费时间,我们必须要对其进行处理,缩小中断处理函数的执行时间。
上半部:
上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。
下半部:
如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出
Linux 内核将中断分为上半部和下半部的主要目的就是实现中断处理函数的快进快出,那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。剩下的所有工作都可以放到下半部去执行,比如在上半部将数据拷贝到内存中,关于数据的具体处理就可以放到下半部去执行。
Linux 内核提供了多种下半部机制:

软中断

Linux 内核使用结构体 softirq_action 表示软中断, softirq_action结构体定义在文件 include/linux/interrupt.h 中,内容如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容
在 kernel/softirq.c 文件中一共定义了 10 个软中断,如下所示:
暂时无法在中科创达软件股份有限公司文档外展示此内容
NR_SOFTIRQS 是枚举类型,定义在文件 include/linux/interrupt.h 中,定义如下:

softirq_action 结构体中的 action 成员变量就是软中断的服务函数,数组 softirq_vec 是个全局数组,因此所有的 CPU(对于 SMP 系统而言)都可以访问到,每个 CPU 都有自己的触发和控制机制,并且只执行自己所触发的软中断。但是各个 CPU 所执行的软中断服务函数确是相同的,都是数组 softirq_vec 中定义的 action 函数。要使用软中断,必须先使用 open_softirq 函数注册对应的软中断处理函数,open_softirq 函数原型如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容

软中断必须在编译的时候静态注册!Linux 内核使用 softirq_init 函数初始化软中断,softirq_init 函数定义在 kernel/softirq.c 文件里面,函数内容如下:

tasklet

tasklet 是利用软中断来实现的另外一种下半部机制,在软中断和 tasklet 之间,建议大家使用 tasklet。Linux 内核使用 tasklet_struct 结构体来表示 tasklet:

第 489 行的 func 函数就是 tasklet 要执行的处理函数,用户定义函数内容,相当于中断处理
函数。如果要使用 tasklet,必须先定义一个 tasklet,然后使用 tasklet_init 函数初始化 tasklet,
taskled_init 函数原型如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容
t:要初始化的 tasklet
func:tasklet 的处理函数。
data:要传递给 func 函数的参数
也 可 以 使 用 宏 DECLARE_TASKLET 来 一 次 性 完 成 tasklet 的 定 义 和 初 始 化 ,DECLARE_TASKLET 定义在 include/linux/interrupt.h 文件中,定义如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容
其中 name 为要定义的 tasklet 名字,这个名字就是一个 tasklet_struct 类型的时候变量,func就是 tasklet 的处理函数,data 是传递给 func 函数的参数。
在上半部,也就是中断处理函数中调用 tasklet_schedule 函数就能使 tasklet 在合适的时间运
行,tasklet_schedule 函数原型如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容
t:要调度的 tasklet
关于 tasklet 的参考使用示例如下所示:

工作队列

工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,所以工作队列允许睡眠或重新调度。如果你要推后的工作可以睡眠那么就可以选择工作队列,否则的话就只能选择软中断或 tasklet。
Linux 内核使用 work_struct 结构体表示一个工作,内容如下(省略掉条件编译):
暂时无法在中科创达软件股份有限公司文档外展示此内容
这些工作组织成工作队列,工作队列使用 workqueue_struct 结构体表示,内容如下

Linux 内核使用工作者线程(worker thread)来处理工作队列中的各个工作,Linux 内核使用worker 结构体表示工作者线程,

从示例代码 51.1.2.10 可以看出,每个 worker 都有一个工作队列,工作者线程处理自己工作队列中的所有工作。在实际的驱动开发中,我们只需要定义工作(work_struct)即可,关于工作队列和工作者线程我们基本不用去管。简单创建工作很简单,直接定义一个 work_struct 结构体变量即可,然后使用 INIT_WORK 宏来初始化工作,INIT_WORK 宏定义如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容
_work 表示要初始化的工作,_func 是工作对应的处理函数。
也可以使用 DECLARE_WORK 宏一次性完成工作的创建和初始化,宏定义如下:
暂时无法在中科创达软件股份有限公司文档外展示此内容
n 表示定义的工作(work_struct),f 表示工作对应的处理函数。
和 tasklet 一样,工作也是需要调度才能运行的,工作的调度函数为 schedule_work,函数原型如下所示:

关于工作队列的参考使用示例如下所示:

3.设备树中断信息节点

如果使用设备树的话就需要在设备树中设置好中断属性信息,Linux 内核通过读取设备树中的中断属性信息来配置中断。对于中断控制器而言,设备树绑定信息参考文档Documentation/devicetree/bindings/arm/gic.txt。

第 2 行,compatible 属性值为“arm,cortex-a7-gic”在 Linux 内核源码中搜索“arm,cortex-a7-gic”即可找到 GIC 中断控制器驱动文件。
第 3 行,#interrupt-cells 和#address-cells、#size-cells 一样。表示此中断控制器下设备的 cells
大小,对于设备而言,会使用 interrupts 属性描述中断信息,#interrupt-cells 描述了 interrupts 属性的 cells 大小,也就是一条信息有几个 cells。每个 cells 都是 32 位整形值,对于 ARM 处理的GIC 来说,一共有 3 个 cells,这三个 cells 的含义如下:
第一个 cells:中断类型,0 表示 SPI 中断,1 表示 PPI 中断。
第二个 cells:中断号,对于 SPI 中断来说中断号的范围为 0~987,对于 PPI 中断来说中断号的范围为 0~15。
第三个 cells:标志,bit[3:0]表示中断触发类型,为 1 的时候表示上升沿触发,为 2 的时候表示下降沿触发,为 4 的时候表示高电平触发,为 8 的时候表示低电平触发。bit[15:8]为 PPI 中断的 CPU 掩码。
第 4 行,interrupt-controller 节点为空,表示当前节点是中断控制器。
简单总结一下与中断有关的设备树属性信息:
暂时无法在中科创达软件股份有限公司文档外展示此内容
获取中断号:

标签:函数,管理,中断,irq,Linux,tasklet,处理函数
From: https://blog.csdn.net/guangali/article/details/141573127

相关文章

  • Linux异步通知
    1.异步通知简介我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。信号类似于我们硬件上使用的“中断”,只不过信号是软......
  • linux目录结构以及文件操作
    从头学习Linux的学习记录。1.Linux目录结构以及文件操作    linux和Windows一样都是操作系统,但是Linux经常用于嵌入式设备中,而我们学习的Ubuntu属于Linux的发行版,带有图形界面,但跑在嵌入式设备上的Linux常没有图形界面,直接用命令行操作,这在对资源敏感的嵌入式领域,节......
  • 计算机毕业设计-基于Java+SSM架构的高校毕业生就业管理系统项目开发实战(附源码+论文)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • DISC性格测试,企业人才测评工具@Hr人力资源管理
    DISC性格测试,是一种常见的企业人才评定方法,用于测试求职者的人际沟通、行为方式和工作风格等。用于评定出一个人的支配性、影响性、服从性和稳定性。支配性也叫管理潜能,很多企业采用DISC来寻找大D型性格,用于人才选拔,团队优化,岗位晋升,无论是人才盘点,还是人才招聘,disc都是不错的......
  • Typora 上传到 Github 实现笔记同步管理
    首先在Github上new一个repository,我建的名称是md_notes然后在本地terminal中启动以下命令新建一个sshkey  ssh-keygen-o  生成的publickey就是我们需要的东西,接着再输入catC:\Users\ASUS/.ssh/id_rsa.pub就能获取到生成的密钥复制生成的密钥(两个......
  • Linux系统性能调优详细讲解和案例示范
    Linux系统以其稳定性和高效性广受欢迎,但在实际使用过程中,随着负载的增加,性能问题也不可避免地出现。本文将深入探讨Linux系统性能调优的核心概念,介绍一些常用的性能定位命令,并结合实际案例详细说明如何解决常见的性能问题。一、性能调优概述在Linux系统中,性能调优是确保......
  • 上网行为管理系统推荐(六款上网行为管理系统介绍)
    上网行为管理系统(IBMS)已成为企业确保网络安全、提升工作效率、保护企业资产的重要工具。本文将为您推荐六款功能强大的上网行为管理系统,助您轻松管理企业网络,守护数据安全。1.网控堡垒系统亮点功能:全面监控:实时监控员工的网页浏览、邮件收发、即时通讯、文件传输等网络活......
  • 基于nodejs+vue办公物资管理系统[程序+论文+开题]-计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,办公物资管理成为企业日常运营中不可或缺的一环。传统的手工记录与人工管理方式已难以满足现代企业对效率、准确......
  • 基于SSM的校园快递服务管理系统【附源码+文档】
    ......
  • java+vue计算机毕设天津市为民律师事务所信息管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在信息化高速发展的今天,律师事务所作为法律服务的重要提供者,其内部管理与服务效率直接影响到客户体验及行业竞争力。天津市为民律师事务所作为本地区......