《linux设备驱动程序》(十六)-中断处理

author author     2023-04-06     557

关键词:

参考技术A

设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。

让CPU进行轮询等待总是不能让人满意,所以通常都采用中断的形式,让设备来通知CPU读取数据。

2.6内核的函数参数与现在的参数有所区别,这里都主要介绍概念,具体实现方法需要结合具体的内核版本。

request_irq函数申请中断,返回0表示申请成功,其他返回值表示申请失败,其具体参数解释如下:

flags 掩码可以使用以下几个:

快速和慢速处理例程 :现代内核中基本没有这两个概念了,使用SA_INTERRUPT位后,当中断被执行时,当前处理器的其他中断都将被禁止。通常不要使用SA_INTERRUPT标志位,除非自己明确知道会发生什么。

共享中断 :使用共享中断时,一方面要使用SA_SHIRQ位,另一个是request_irq中的dev_id必须是唯一的,不能为NULL。这个限制的原因是:内核为每个中断维护了一个共享处理例程的列表,例程中的dev_id各不相同,就像设备签名。如果dev_id相同,在卸载的时候引起混淆(卸载了另一个中断),当中断到达时会产生内核OOP消息。

共享中断需要满足以下一个条件才能申请成功:

当不需要使用该中断时,需要使用free_irq释放中断。

通常我们会在模块加载的时候申请安装中断处理例程,但书中建议:在设备第一次打开的时候安装,在设备最后一次关闭的时候卸载。

如果要查看中断触发的次数,可以查看 /proc/interrupts 和 /proc/stat。

书中讲述了如何自动检测中断号,在嵌入式开发中通常都是查看原理图和datasheet来直接确定。

自动检测的原理如下:驱动程序通知设备产生中断,然后查看哪些中断信号线被触发了。Linux提供了以下方法来进行探测:

探测工作耗时较长,建议在模块加载的时候做。

中断处理函数和普通函数其实差不多,唯一的区别是其运行的中断上下文中,在这个上下文中有以下注意事项:

中断处理函数典型用法如下:

中断处理函数的参数和返回值含义如下:

返回值主要有两个:IRQ_NONE和IRQ_HANDLED。

对于中断我们是可以进行开启和关闭的,Linux中提供了以下函数操作单个中断的开关:

该方法可以在所有处理器上禁止或启用中断。

需要注意的是:

如果要关闭当前处理器上所有的中断,则可以调用以下方法:

local_irq_save 会将中断状态保持到flags中,然后禁用处理器上的中断;如果明确知道中断没有在其他地方被禁用,则可以使用local_irq_disable,否则请使用local_irq_save。

locat_irq_restore 会根据上面获取到flags来恢复中断;local_irq_enable 会无条件打开所有中断。

在中断中需要做一些工作,如果工作内容太多,必然导致中断处理所需的时间过长;而中断处理又要求能够尽快完成,这样才不会影响正常的系统调度,这两个之间就产生了矛盾。

现在很多操作系统将中断分为两个部分来处理上面的矛盾:顶半部和底半部。

顶半部就是我们用request_irq来注册的中断处理函数,这个函数要求能够尽快结束,同时在其中调度底半部,让底半部在之后来进行后续的耗时工作。

顶半部就不再说明了,就是上面的中断处理函数,只是要求能够尽快处理完成并返回,不要处理耗时工作。

底半部通常使用tasklet或者工作队列来实现。

tasklet的特点和注意事项:

工作队列的特点和注意事项:

linux驱动开发-中断处理模型笔记5(代码片段)

...理模型1、概念解析a)I/O操作的不确定因素以及处理器和I/O设备之间速度不匹配,设备往往通过某种硬件信号异步唤起处理器的注意b)这些硬件信号就称为中断,每个设备都被分配了一个相关的标示符,别称为中断请求... 查看详情

linux中断补充

...系统结构中,CPU工作的模式有两种,一种是中断,由各种设备发起;一种是轮询,由CPU主动发起。中断IRQ:中断允许让设备(如键盘,串口卡,并口等设备)表明它们需要CPU。一旦CPU接收了中断请求,CPU就会暂时停止执行正在运... 查看详情

linux驱动开发-中断处理模型笔记5(代码片段)

...理模型1、概念解析a)I/O操作的不确定因素以及处理器和I/O设备之间速度不匹配,设备往往通过某种硬件信号异步唤起处理器的注意b)这些硬件信号就称为中断,每个设备都被分配了一个相关的标示符,别称为中断请求... 查看详情

linux设备驱动基础02之中断处理(代码片段)

一、基础概念中断系统是一个处理器的重要且基本的组成部分,可以极大提高CPU的执行效率,一般中断系统框架组成如下图:1、中断控制器中断控制器是整个中断系统的管理机构。Cortex-A中断控制器叫GIC(GerneralInterrupt... 查看详情

在 Linux 中处理 /dev/tty 设备上的用户中断(UART 中断)

】在Linux中处理/dev/tty设备上的用户中断(UART中断)【英文标题】:HandlingUser-Break(UARTBreak)ona/dev/ttydeviceinLinux【发布时间】:2009-06-1021:29:17【问题描述】:这里是一些代码示例,但问题是当使用“putty”通过串行线路发送“break”... 查看详情

设备驱动中的并发控制

在为操作系统编写驱动设备时,因为涉及到中断、多任务和多处理器SMP的处理,所以内核提供了诸如中断屏蔽、原子操作、信号量、完成量等几种并发控制机制,对公用资源进行保护。下文将分别予以阐述。0、中断中断屏蔽使... 查看详情

读薄《linux内核设计与实现》-中断与同步

...因此,内核随时可能因为新到来的中断而被打断。不同的设备对应的中断不同,每个中断通过一 查看详情

linux设备驱动基础02之中断处理(代码片段)

一、基础概念中断系统是一个处理器的重要且基本的组成部分,可以极大提高CPU的执行效率,一般中断系统框架组成如下图:1、中断控制器中断控制器是整个中断系统的管理机构。Cortex-A中断控制器叫GIC(GerneralInterrupt... 查看详情

linux中断所有知识点(代码片段)

...断类别GICv3组成中断路由中断状态机中断处理流程GIC驱动设备树初始化中断的映射数据结构中断控制器注册irq_domain外设的驱动创建硬中断和虚拟中断号的映射关系中断的注册中断的处理保护现场中断处理恢复现场总结中断下半部... 查看详情

linux设备树-中断控制器驱动(代码片段)

...统执行流程 介绍了中断的执行流程,以及在没有使用设备树的情景下,中断控制器的注册流程,其主要流程:将S3C2440中断资源抽象为一个主中断控制器、两个子中断控制器,一个用于管理外部中断源、另一个管理带有子中... 查看详情

5.2linux中断注册

...,是否共享,是否支持嵌套等第4个参数name,通常是设备驱动程序的名称。该值用在/proc/interrupt系统文件上第5个参数dev中断名称可作为共享中断时的中断区别参数,也可以用来指定中断服务函数需要参考的数据地址。建议将设备... 查看详情

linux驱动实践:中断处理函数如何发送信号给应用层?(代码片段)

文章目录驱动程序示例代码全貌Makefile文件编译、测试应用程序示例代码全貌编译、测试别人的经验,我们的阶梯!大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断程序如何发送信号给应用层... 查看详情

映射 SAM L10 设备的中断处理程序

】映射SAML10设备的中断处理程序【英文标题】:MapinterrupthandlersforSAML10device【发布时间】:2022-01-0400:24:15【问题描述】:我一直试图在使用SAML10MCU的系统上设置I2C。我已经能够在MPLABX上将我的项目作为独立项目构建,而无需使用M... 查看详情

MSI 中断如何在 linux 驱动程序中工作?

】MSI中断如何在linux驱动程序中工作?【英文标题】:HowdoesMSIinterruptworkinlinuxdriver?【发布时间】:2016-08-1521:47:36【问题描述】:目前正在开发PCI设备驱动程序。该设备的编程如下:当DMA传输完成时,设备会向PC发送一个MSI中断,... 查看详情

linux设备驱动中的异步通知机制(代码片段)

前言异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”.信号是在软件层次上对中断机制的一... 查看详情

linux设备驱动的并发控(代码片段)

文章目录并发和竞态编译乱序和执行乱序并发控制机制中断屏蔽local_irq_disable原子操作atomic整型原子操作位原子操作自旋锁spin_lock自旋锁的使用读写自旋锁rwlock顺序锁seqlock读-复制-更新RCU信号量Semaphore互斥体mutex完成量Completion并... 查看详情

linux设备驱动的并发控(代码片段)

文章目录并发和竞态编译乱序和执行乱序并发控制机制中断屏蔽local_irq_disable原子操作atomic整型原子操作位原子操作自旋锁spin_lock自旋锁的使用读写自旋锁rwlock顺序锁seqlock读-复制-更新RCU信号量Semaphore互斥体mutex完成量Completion并... 查看详情

中断处理程序使用哪个堆栈 - Linux

】中断处理程序使用哪个堆栈-Linux【英文标题】:WhichstackisusedbyInterruptHandler-Linux【发布时间】:2015-04-2919:41:06【问题描述】:在多任务系统中,当任何硬件对特定CPU产生中断时,CPU可以执行以下任何一种情况,除非它已经在为IS... 查看详情