linux下怎样看设备的中断号,Linux设备驱动的中断处理

Linux设备驱动中,中断处理非常重要,尤其是在嵌入式系统中,无时无刻不在与中断打交道,因此,中断处理必须要牢牢掌握。

设备在产生某个事件时通知处理器的方法就是中断。中断就是一个信号,当硬件需要通知CPU你该处理我的数据或状态时,就会发出这个信号,而处理器如果发现驱动注册了该中断信号,就会保存现场,执行中断处理程序,然后再恢复现场。中断处理程序和其他代码是并行的,因此必须考虑竞态问题。

1.注册中断

内核维护了一个中断信号线的注册表,驱动模块在使用中断前要先请求一个中断通道(或者 IRQ中断请求),并在使用后释放它。

int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);

void free_irq(unsigned int irq, void *dev_id);

中断处理例程可在驱动初始化时或在设备第一次打开时安装。推荐在设备第一次打开、硬件被告知产生中断前时申请中断,因为可以共享有限的中断资源。这样调用 free_irq 的位置是设备最后一次被关闭、硬件被告知不用再中断处理器之后。但这种方式的缺点是必须为每个设备维护一个打开计数。

i386 和 x86_64 体系定义了一个函数来查询一个中断线是否可用:

int can_request_irq(unsigned int irq, unsigned long flags); /*当能够成功分配给定中断,则返回非零值。但注意,在 can_request_irq 和 request_irq 的调用之间给定中断可能被占用*/

快速中断和慢中断

在现代内核中,快速和慢速中断的区别已经消失,剩下的只有一个:快速中断(使用 SA_INTERRUPT )执行时禁止所有在当前处理器上的其他中断(其他处理器仍然可以响应中断)。除非你充足的理由在禁止其他中断情况下来运行中断处理例程,否则不应当使用SA_INTERRUPT。这个在嵌入式系统中或许用的比较多。

/proc/interrupts:记录了中断信息统计

/proc/stat:记录了系统活动的底层统计信息

2.自动检测 IRQ 号

驱动初始化时最迫切的问题之一是决定设备要使用的IRQ 线,驱动需要信息来正确安装处理例程。自动检测中断号对驱动的可用性来说是一个基本需求。有时自动探测依赖一些设备具有的默认特性,以下是典型的并口中断探测程序:

if (short_irq < 0) /* 依靠使并口的端口号,确定中断*/

switch(short_base) {

case 0x378: short_irq = 7; break;

case 0x278: short_irq = 2; break;

case 0x3bc: short_irq = 5; break;

}

有 2 种方法来进行探测中断: 调用内核定义的辅助函数和DIY探测。

(1)调用内核定义的辅助函数

unsigned long probe_irq_on(void); /*这个函数返回一个未分配中断的位掩码。驱动必须保留返回的位掩码, 并在后面传递给 probe_irq_off。在调用probe_irq_on之后, 驱动应当安排它的设备产生至少一次中断*/

int probe_irq_off(unsigned long); /*在请求设备产生一个中断后, 驱动调用这个函数, 并将 probe_irq_on 返回的位掩码作为参数传递给probe_irq_off。probe_irq_off 返回在"probe_on"之后发生的中断号。如果没有中断发生, 返回 0 ;如果产生了多次中断,probe_irq_off 返回一个负值*/

(2)DIY探测

DIY探测与前面原理相同: 使能所有未使用的中断, 接着等待并观察发生什么。

3.实现中断处理例程

中断处理例程唯一的特别之处在中断时运行,它能做的事情受到了一些限制:

(1)中断处理例程不能与用户空间传递数据, 因为它不在进程上下文执行;

(2)中断处理例程也不能做任何可能休眠的事情, 例如调用 wait_event, 使用除 GFP_ATOMIC 之外任何东西来分配内存, 或者锁住一个信号量;

(3)处理者不能调用schedule()。

4.禁用中断

(1)禁用单个中断

void disable_irq(int irq);/*禁止给定的中断, 并等待当前的中断处理例程结束。如果调用 disable_irq 的线程持有任何中断处理例程需要的资源(例如自旋锁), 系统可能死锁*/

void disable_irq_nosync(int irq);/*禁止给定的中断后立刻返回(可能引入竞态)*/

void enable_irq(int irq);

(2)禁用全部中断

void local_irq_save(unsigned long flags);/*在保存当前中断状态到 flags 之后禁止中断*/

void local_irq_disable(void);/* 关闭中断而不保存状态*/

如果调用链中有多个函数可能需要禁止中断, 应使用 local_irq_save

void local_irq_restore(unsigned long flags); /*打开中断使用*/

void local_irq_enable(void);

在 2.6 内核, 没有方法全局禁用整个系统上的所有中断

5.中断顶半部和底半部

中断处理需要很快完成,可通过将中断处理分为两部分来解决这个问题:

(1)顶半部,立即执行,实际响应中断的例程(request_irq 注册的那个例程)

(2)底版本,被顶半部调度,并在稍后更安全的时间内执行的函数

Linux 内核有 2 个不同的机制可用来实现底半部处理:

(1)tasklet (首选机制),它非常快, 但是所有的 tasklet 代码必须是原子的。

(2)工作队列, 它可能有更高的延时,但允许休眠,执行在进程上下文中,但不允许与用户空间进行数据拷贝。

6.中断共享

Linux 内核支持在所有总线上中断共享,Linux大部分中断都是可以共享的。

在通过request_irq 安装处理例程时候,有些不同:

(1)当request_irq 时,flags 中必须指定SA_SHIRQ 位;

(2)dev_id 必须唯一。任何指向模块地址空间的指针都行,但 dev_id 绝不能设置为NULL。

请求一个共享的中断时,如果满足下列条件之一,则request_irq 成功:

(1)中断线空闲;

(2)所有已经注册该中断信号线的处理例程也标识了IRQ是共享。

一个共享的处理例程必须能够识别自己的中断,并且在自己的设备没有被中断时快速退出(返回 IRQ_NONE )。共享处理例程没有探测函数可用,但使用的中断信号线是空闲时标准的探测机制才有效。一个使用共享处理例程的驱动需要小心:不能使用 enable_irq 或 disable_irq,否则,对其他共享这条线的设备就无法正常工作了。即便短时间禁止中断,另一设备也可能产生延时而为设备和其用户带来问题,因为这个中断可能不是你一个驱动模块在关注。

7.中断驱动的 IO

当与驱动程序管理的硬件间的数据传送可能因为某种原因而延迟,驱动编写者应当实现缓存。

输入:当新数据到达时并且处理器准备好接受时,设备中断处理器。

输出:当设备准备好接受新数据或确认一个成功的数据传送时,设备产生中断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python删除重复元素_Python-删除列表中重复元素的方法

原博文 2017-12-21 17:07 − 1.set()方法 x [1,2,3,4,5,1] y list(set(x)) print(y) [1, 2, 3, 4, 5] 2. x [b,c,d,b,c,a,a] y {}.fromkeys(x).ke... 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对象的动态类型语…

linux内核提取ret2usr,Linux内核漏洞利用技术详解 Part 2

前言在上一篇文章中&#xff0c;我们不仅为读者详细介绍了如何搭建环境&#xff0c;还通过一个具体的例子演示了最简单的内核漏洞利用技术&#xff1a;ret2usr。在本文中&#xff0c;我们将逐步启用更多的安全防御机制&#xff0c;即SMEP、KPTI和SMAP&#xff0c;并逐一解释它们…

raid5坏了一块盘怎么办_机械硬盘的坏道处理——屏蔽之

分享一次处理硬盘坏道的经历。打算写的让小白也能照着葫芦画葫芦。机械硬盘的阿喀琉斯之踵无疑是坏道。倘若一块硬盘出现了坏道怎么办&#xff1f;当然是即刻备份资料更换新硬盘。毫无疑问&#xff0c;二手硬盘几乎都是被榨干的状态&#xff0c;活生生地一副论斤卖的样子。当然…

linux 嵌入式 交叉 环境搭建 实验原理,实验三 嵌入式Linux开发环境的搭建

南京邮电大学通达学院实 验 报 告实验 实验三题目 嵌入式Linux开发环境的搭建 课程名称 嵌入式驱动开发实验 学院 专业 班 实验者学号同做者学号 08002210 姓名 毛骏超 同做者学号 08002225 姓名 陈超/ 嵌入式应用开发实验成绩 评定一、实验目的1.掌握嵌入式交叉编译环境的搭建…

insert into select 优化_数据库优化总结

第一部分&#xff1a;SQL语句优化1、尽量避免使用select *&#xff0c;使用具体的字段代替*&#xff0c;只返回使用到的字段。2、尽量避免使用in 和not in&#xff0c;会导致数据库引擎放弃索引进行全表扫描。SELECT * FROM t WHERE id IN (2,3)SELECT * FROM t1 WHERE usernam…

.npy文件_python——文件读写

一&#xff1a;Python中读写文件的方法1.open&#xff08;&#xff09;函数open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdTrue,openerNone)file &#xff1a; 是一个 path-like object&#xff0c;表示将要打开的文件的路径&#xff0c;可以是绝对…

arm-linux-gcc 硬浮点,ARMCC和GCC编译ARM代码的软浮点和硬浮点问题 【转】

本文介绍了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念&#xff0c;然后是在GCC和ARMCC RVCT工具链下的具体编译参数。VFP (vector floating-point)从ARMv5开始&am…

react native loading动画_React高级进阶指南

懒加载React.lazy函数能让你像渲染常规组件一样处理动态引入(的组件)。 Suspense加载指示器为组件做优雅降级。 fallback属性接受任何在组件加载过程中你想展示的 React 元素。const OtherComponent React.lazy(() > import(./OtherComponent));function MyComponent() { r…

虚拟接口+tx+linux,Linux使用笔记: 解决Xen虚拟机中VLAN接口不能ping大包的问题

出于调试的需要&#xff0c;想在两个Xen虚拟机间使用VLAN相互访问。在Linux上启用VLAN非常简单&#xff0c;只需要使用命令vconfig配置一个VLAN接口就可以了&#xff1a;vconfig add eth0 3ifconfig eth0.3 11.11.4.2 netmask 255.255.255.0 up删除VLAN则使用vconfig rem eth0.…

在一起计时器_古典计时器简介之一 qqtimer

可持续水文的路子又多了一条。在这一系列古典计时器中&#xff0c;qqtimer的地位有些特殊&#xff0c;因为现在还有不少人使用它&#xff0c;而之后要介绍的其他计时器已经基本没啥人用了。有两位最知名的WR日常练习的计时器都是它。首先是Feliks Zemdegs&#xff0c;虽然他已经…

可以装linux的路由器,[转载]linux路由器Quagga的配置(一):安装

部分资料摘自http://blog.chinaunix.net/uid-25513153-id-212328.htmlQuagga是一款功能比较强大的开源路由软件&#xff0c;支持rip,ripng,ospfv2,ospfv3&#xff0c;bgp等协议。目前最新版本为Quagga0.99.17。安装Quagga的目的是使装有linux(我采用的是Ubuntu10.04LTS)系统的电…

管理节点连接不上sql节点_质量成本管理:成本控制、成本分析、费用使用流程与节点说明...

关注【本头条号】更多关于制度、流程、体系、岗位、模板、方案、工具、案例、故事、图书、文案、报告、技能、职场等内容&#xff0c;弗布克15年积累免费与您分享&#xff01;阅读导航→01 质量成本控制流程与节点02 质量成本分析流程与节点03 质量费用使用控制流程与节点质量部…

linux ipset 流量,linux中ipset命令的使用方法详解

linux中ipset命令的使用方法详解发布时间&#xff1a;2020-10-25 17:07:19来源&#xff1a;脚本之家阅读&#xff1a;97作者&#xff1a;lijiaocn栏目&#xff1a;服务器ipset介绍iptables是在linux内核里配置防火墙规则的用户空间工具,它实际上是netfilter框架的一部分.可能因…

springmvc工作流程_SpringMVC工作原理

买了好多书&#xff0c;但是没有一本是看完的&#xff0c;这是看完的第一本书&#xff0c;虽然页数不多、技术早就用了老多遍了&#xff0c;还是总结一下吧&#xff01;一、MVC模式MVC是 model、view、和controller的缩写&#xff0c;分别代表web应用程序中的三种职责&#xff…

c语言 vc++6.0集成开发环境的使用,VC6.0集成开发环境的使用.ppt

《VC6.0集成开发环境的使用.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《VC6.0集成开发环境的使用.ppt(11页珍藏版)》请在人人文库网上搜索。1、VC6.0集成开发环境,VC6.0集成开发环境,1.建立工作区(一),(1)选择菜单“FileNew”&#xff0c;打开“New”对话框&…

sql查找一个范围的值_销售需求丨查找问题

BOSS&#xff1a;茶&#xff0c;那个&#xff0c;什么茶来着&#xff1f;&#xff08;递过一杯茶...&#xff09;BOSS&#xff1a;&#xff1f;&#xff01;&#xff01;不是这个&#xff0c;我是说那个白茶啊&#xff01;白茶&#xff1a;......&#xff08;懵&#xff09;咋滴…

怎样用c语言算平均成绩,用C语言编程平均分数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼当个反面典型&#xff0c;让大家见识下丑陋无比的程序好了&#xff0c;主要是想练练打字&#xff0c;HOHO。应该用二维数组且全部函数化的&#xff0c;rand的%后面或是101或是100&#xff0c;可能和编译器有关&#xff0c;TC2下应写…

pandas输出到excel_学Python还不会处理Excel数据?带你用pandas玩转各种数据处理

开场白以前学习 Python 的 pandas 包时&#xff0c;经常到一些 excel 的论坛寻找实战机会。接下来我会陆续把相关案例分享出来&#xff0c;还会把其中的技术要点做详细的讲解。本文要点&#xff1a;使用 xlwings &#xff0c;如同 vba 一样操作 excel使用 pandas 快速做透视表注…

cadence设计运算放大器_21.比较器的原理与特性,它与运算放大器的本质区别总结归纳...

1.电压比较器的工作原理电压比较器&#xff0c;顾名思义&#xff0c;就是两个输入端的其中一个作为基准&#xff0c;另外一个与基准作比较&#xff0c;输出只存在高电平和低电平两种状态。通过电压比较器&#xff0c;可以将模拟信号转变为数字信号。输入引脚的电位 > -输入引…

在c语言程序中无论是整数还是实数,C语言基础题及参考答案

C第一单元程序设计和&#xff23;语言一、选择题1&#xff0e;C语言的基本构成单位是&#xff1a; A 。A. 函数B. 函数和过程C. 超文本过程D. 子程序2&#xff0e;一个C语言程序总是从 B 开始执行。A. 主过程B. 主函数C. 子程序D.主程序3&#xff0e;C语言的程序一行写不下时&a…