linux 中断处理

Linux源代码阅读:request_irq() 本文尝试阅读Linux kernel 5.0 + ARM64上中断申请过程的源代码,但并非逐字逐句地解析,只是梳理一些关键点(在工作中经常可能会用到的知识点)。 为了提升Linux的实时性,kernel引入了中断线程化概念。其实就是将中断的下半部放在内核线程(FIFO,也称实时进程)中执行,这样可以减少中断对高优先级进程的饥饿感。因为传统的中断上半部执行完成后,需要通过tasklet,或者softirq来执行中断下半部,这些都属于中断上下文,会被内核优先处理,这样就会导致进程产生饥饿,即使是优先级比较高的 阅读详情

中断处理 

在 2.4 内核和 2.6内核中都使用 request_irq() 函数来注册中断服务函数。在 2.4 内核中,需要包含的头文件是 #include <linux/sched.h> ,2.6 内核中需要包含的头文件则是 #include <linux/interrupt.h> 。函数原型如下:

  • 2.4 内核

int request_irq (unsigned int irq, void (*handler)(int, void *, struct pt_regs *), unsigned long frags, const char *device, void *dev_id);

 

  • 2.6 内核

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);

在发生对应于第 1个参数 irq 的中断时,则调用第 2 个参数 handler 指定的中断服务函数(也就是把 handler() 中断服务函数注册到内核中 )。
第 3 个参数 flags 指定了快速中断或中断共享等中断处理属性。在 2.6 教新的内核里(我的是 2.6.27 ~ 2.6.31 ),在 linux/interrupt.h 中定义操作这个参数的宏如下:

/*
* These flags used only by the kernel as part of the
* irq handling routines.
*
* IRQF_DISABLED - keep irqs disabled when calling the action handler
* IRQF_SAMPLE_RANDOM - irq is used to feed the random generator
* IRQF_SHARED - allow sharing the irq among several devices
* IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
* IRQF_TIMER - Flag to mark this interrupt as timer interrupt
* IRQF_PERCPU - Interrupt is per cpu
* IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
* IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is
*                registered first in an shared interrupt is considered for
*                performance reasons)
*/
#define IRQF_DISABLED           0x00000020
#define IRQF_SAMPLE_RANDOM      0x00000040
#define IRQF_SHARED             0x00000080
#define IRQF_PROBE_SHARED       0x00000100
#define IRQF_TIMER              0x00000200
#define IRQF_PERCPU             0x00000400
#define IRQF_NOBALANCING        0x00000800
#define IRQF_IRQPOLL            0x00001000

 

早期一点的 2.6 内核这里一般以 SA_ 前缀开头,如:
SA_INTERRUPT   表示禁止其他中断;(对应于 IRQF_DISABLED )
SA_SHIRQ             表示共享相同的中断号 (对应于 IRQF_SHARED )
SA_SAMPLE_RANDOM   此宏会影响到 RANDOM 的处理( 对应于 IRQF_SAMPLE_RANDOM )。

第 4 个参数 name 通常是设备驱动程序的名称。改值用在 /proc/interrupt 系统 (虚拟) 文件上,或内核发生中断错误时使用。

第 5 个参数 dev_id 可作为共享中断时的中断区别参数,也可以用来指定中断服务函数需要参考的数据地址。

返回值:
函数运行正常时返回 0 ,否则返回对应错误的负值。

示例代码片段:

irqreturn_t xxx_interrupt ( int irq , void * dev_id)
{
        ...

        return ( IRQ_HANDLED);
}

int xxx_open ( struct inode * inode , struct file * filp)
{
        if ( ! request_irq ( XXX_IRQ , xxx_interruppt , IRQF_DISABLED , "xxx" , NULL)) {

                /*正常注册*/
        }

        return ( 0);
}

 

 
  如果登记成功,返回0,这时在/proc/interrupts文件中可以看你请求的中断。 

 

http://huxiongwei.spaces.eepw.com.cn/articles/article/item/74756

 

http://blog.sina.com.cn/s/blog_484572870100ckei.html

 

http://www.groad.net/bbs/read.php?tid-1261.html

Linux中断——request_irq 目录 linux 中断之irq 前言 中断注册与释放 irq相关 查看/proc/interrupts 查看/proc/stat IRQ Number问题 Handler相关 flag相关 linux 中断之irq 前言 前面一篇文章已经对中断做了一些简单介绍《关于Linux中断一些思考》,但是中断是怎么告诉内核(kernel)的呢?这里我们带着问题去了解一下irq的调用。 所谓中断它其实是硬件产生了一个信号,然后告诉内核要去处理它。Linux处理中断很像用户空间(user . 阅读详情

相关推荐

Linux中的中断处理

与Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq(), request_irq()的原型为: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irq

张勤一 5969

Linux中断

按键中断,定时器消抖

afddasfa的博客 6152

Linux的中断处理分析

MIPS中,中断被当作一种异常(第0号异常)来处理。中断由外部设备产生,可能发生在任何时刻,每个中断都有一个编号分配给一个外部设备,这样来区分不同设备产生的中断,如果硬件和内核支持共享中断,则可以由多个设备共享一个中断编号。         在CPU得知中断发生后,它将进一步的处理委托给一个软件例程,这个软件例程是体系结构相关的,然后根据中断号来识别中断源,并进入特定的中断处理程序来处理该中断。

落尘纷扰的专栏 2511

中断申请函数request_irq详解

原地址:http://blog.youkuaiyun.com/wealoong/article/details/7566546 一、中断注册方法 在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, irq_handler_t handler,     

2万+

手把手教你学pcie--msix中断机制内核函数(四):request_irq

是 Linux 内核中用于注册中断处理程序的函数。它允许设备驱动程序为特定的中断号(IRQ)绑定一个中断处理函数,从而在硬件设备触发中断时调用该函数进行处理。的使用方法,开发者可以更好地设计中断驱动逻辑,确保设备能够高效地与系统交互。以下是一个完整的示例,展示如何使用。

MHD0815的博客 492

研究生如何快速发CVPR

研究生如何快速发CVPR,找到科研方向

python_vb的博客 785

Linux中断处理流程

结构体作用irq_chip提供 GIC 操作方法(ackeoimask等),直接控制中断控制器硬件行为。irq_domain管理硬件中断号到 Linux 中断号的映射,确保内核正确识别中断来源。irq_desc存储中断描述符,维护irqaction链表,是中断处理的核心管理结构。irqaction包含网卡驱动的中断处理函数,执行数据读取、协议处理等业务逻辑。

m0_74186706的博客 1301

CANape快速上手

文章帮助记录CANape学习过程。

小弱鸡的博客 1万+

linux中中断处理函数,Linux中断处理浅析

最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着"重要的事马上做, 不重要的事推后做"的异步处理思想. 于是整理一下~第一阶段--获取中断号每个CPU都有响应中断的能力, 每个CPU响应中断时都走相同的流程. 这个流程就是内核提供的中断服务程序.在进入中断服务程序时, CPU已经自动禁止了本CPU上的中断响应, 因为CPU不能假定中断服务程序是可重入的.中断处理程...

weixin_33375038的博客 534

AUTOSAR网络管理配置详解:Vector DaVinci工具全面讲解

手把手带你用Vector DaVinci完成AUTOSAR网络管理模块的配置,涵盖NmChannel、NmPdu、重复帧抑制等关键参数设置,深入解析CAN总线上的NM报文调度与唤醒机制,助你扎实掌握AUTOSAR网络管理核心实践。

weixin_42504649的博客 168

Isaac Sim 使用经验(配置要求,云服务器)

Google Colab及AutoDL都是在docker内运行,其中google colab并不支持docker指令,而依照AutoDL的相关文档,AutoDL并不直接提供docker指令。2. Google Colab/AutoDL 不支持图形化界面,图形渲染等任务,所以没有办法使用Omniverse Streaming进行直播,从而更好的对结果进行展示。对于第一点,或许存在直接手动复现镜像的可能,但是考虑到Isaac Sim/Isaac Lab由于比较新,可能不够稳定,因此还是按照官方文档进行部署。

weixin_44211433的博客 4587

Linux中断处理

Linux中断处理1、  Introduce 异常为同步事件,有当前进程执行引发,处于被打断的进程的上下文中,为当前被打断的进程服务,可以调用任何内核态的函数,也可以睡眠。中断时异步事件,虽然使用当前被打断的进程的上下文中,但和当前进程没有必然的关系,同时要求能快速处理以便能及时响应下一次中断,因此在中断处理过程中是不可睡眠的。IA32体系允许256个中断、异常源,0~31用于不可屏蔽中断

w_health的专栏 1321

2023华为od机试C卷【最富裕的小家庭】Python 实现

在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为个小家庭。现给你一颗树,请计算出最富裕的小家庭的财富和。

MISAYAONE的博客 2042

4.3 Linux的中断处理流程

从一副图说起,以Linux通用中断子系统的数据结构为中心,分四步描述了Linux中断处理流程: 第一步,从hwirq发生到转换成virq(图左侧从上到下) 第二步,找出virq对应的irq_desc(图底部从左到右) 第三步,执行中断流控处理程序(图右侧从下向上) 第四步,执行中断处理程序(图的终点)

三问Linux社区 2253

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 896

MIPI D-PHY的校准测试

MIPI的校准测试困扰了很久,今天终于得以解决!

一只豌豆象的博客 3919

Linux 中断之中断处理浅析

1. 中断的概念 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的 CPU 暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。 软件对硬件进行配置后,软件期望等待硬件的某种状态(比如,收到了数据),这里有两种方式,一种是轮询(pol...

StephenZhou 2万+

【LIN总线测试】——LIN主节点物理层测试

LIN总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议。其目标定位于车身网络模块节点间的低端通信,主要用于智能传感器和执行器的串行通信,而这正是CAN总线的带宽和功能所不要求的部分。本章节主要介绍LIN主节点物理层如何测试?

测试领域技术分享 5529

linux 中断和中断处理程序

在linux中中断的使用是无时不在,下面就自己的学习心得和大家分享 一下!

工匠 2045

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

linux中断处理程序,linux 中断处理

Linux设备驱动中中断处理相关的首先是申请与释放IRQ的API request_irq()和free_irq()intrequest_irq(unsignedintirq,//irq是要申请的硬件中断号void(*handler)(intirq,void*dev_id,structpt_regs*regs),unsignedlongirqflags,constcha...

weixin_42298973的博客 327

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Linux】—中断处理流程

简单了解Linux中实现中断过程。这里参考一篇博文、《深入Linux内核架构》和Linux 2.6.11源码,基于ARM架构实现的中断过程来理解中断的实现过程。|set_type|设置IRQ的电流类型。该方法主要使用在ARM、PowerPC和SuperH机器上。,一个中断可以有多个处理函数,当一个中断有多个处理函数,说明这个是共享中断。将新注册的action,挂载到irqaction上。将irq和action进行关联。开机启动时会进行一些中断注册。设定irqaction。

王磊明的博客 1808

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: AT91sam9260 串口中断
下一篇: linux中的outb、outw、inb、inw
onlyfever
博客等级 码龄17年 15粉丝 116原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值