Linux设备驱动程序 之 中断下半部
中断处理程序的局限
1. 中断处理程序以异步的方式执行,并且它有可能会打断其他重要代码的执行,因此,为了避免被打段的代码停止时间过长,中断处理程序应该执行的越快越好;
2. 如果当前有一个中断处理程序在执行,在最好的情况下(没有设置IRQF_DISABLED),与该中断同级别的其他中断就会被屏蔽,在最坏情况下(设置了IRQF_DISABLED),当前处理器上所有其他中断都会被屏蔽;因为禁止中断后,硬件与操作系统无法通信,因此,中断处理程序执行的越快越好;
3. 由于中断处理程序往往需要对硬件进行操作,所以它们通常有很高的时限要求;
4. 中断处理程序不在进程上下文中运行,所以它们不能阻塞,这限制了它们所做的的事情;
下半部
下半部的任务就是执行与中断处理密切相关但是中断处理程序本身不执行的工作;在理想的情况下,最好是中断处理程序将所有工作都交给下半部执行,因为我们希望在中断处理程序中完成的工作越少越好,我们期望中断处理程序能够尽快的返回;
中断处理程序和下半部之间划分借鉴:
1. 如果一个任务对事件非常敏感,则将其放在中断处理程序中;
2. 如果一个任务和硬件相关,那么将其放在中断处理程序中;
3. 如果一个任务要保证不被其他中断(特别是同级中断)打断,那么将其放在中断处理程序中;
4. 其他所有任务,考虑放置在下半部执行;
下半部的方式和选择
下半部提供了三种实现方式:软中断、tasklet和工作队列;tasklet基于软中断实现,所以两者很接近;工作队列机制与它们完全不同,它靠内核线程实现;
软中断体用的执行序列化的保障最少,这就要求软中断处理函数必须格外小心地采取一些步骤确保共享数据的安全,两个甚至更多相同类型的软中断有可能在不同的处理器上同时执行;如果被考察的代码本身多线索化的工作做得非常好,比如网络子系统,它完全使用单处理器变量,那么软中断就是非常好的选择;对于时间要求严格和执行频率很高的应用来说,它执行得也最快;
如果代码多线索化考虑的并不充分,那么选择tasklet意义更大;它的接口非常简单,而且,由于两个同种类型的tasklet不能同时执行,所以实现起来也会简单一些;tasklet是有效的软中断,但不能并发执行;驱动程序开发者应当尽可能的选择tasklet而不是软中断;当然,如果准备利用每处理器变量,以确保软中断安全的在多个处理器上并发的运行,那么还是选择软中断;
如果需要把任务退后到进程上下文中完成,那么在这三者中就只能选择工作队列了,如果进程上下文并不是必须条件(也就是如果不需要睡眠),那么软中断和tasklet可能更合适;工作队列造成的开销最大,因为它要牵扯到内核线程甚至上下文切换;这并不是说工作队列效率低,如果每秒钟有几千次中断,那么其他机制可能更合适一些;
简单的说,一般驱动程序编写者需要做两个选择:首先,是不是需要一个可调度的实体来执行需要推后完成的工作-从根本上说,有休眠的需要吗?有,工作队列就是唯一选择;否则,最好用tasklet;要是必须专注性能的提高,那就考虑软中断;
Linux设备驱动程序 之 中断下半部的更多相关文章
- Linux设备驱动程序 之 中断
中断 中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据:硬件设备生成中断并 ...
- Linux设备驱动程序 之 中断和锁
中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
- linux设备驱动程序--gpio控制
gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- 嵌入式Linux设备驱动程序:发现硬件配置
嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...
随机推荐
- 一、eureka服务端自动配置
所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 @EnableEurekaServer开关 eureka是一个c/s架构的服务治理框架, ...
- 安卓直连SQLSEVER数据库
1.导入连接SQLSEVER的jar包:可以支持android的SQL驱动(如:jtds-1.2.7.jar) 2.编写连接数据库的工具类 import java.lang.reflect.Field ...
- springmvc模式下的上传和下载
接触了springmvc模式后,对上一次的上传与下载进行优化, 上次请看这里. 此处上传的功能依旧是采用表格上传.文件格式依旧是 <form action="${pageContext ...
- Image Processing and Analysis_8_Edge Detection:Edge Detection Revisited ——2004
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- 浅谈sass与less区别优缺点
Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...
- 开启 clr enabled
'; GO RECONFIGURE; GO '; GO RECONFIGURE; '; GO
- 使用pyinstaller打包使用scrapy模块的程序运行时出现No such file or directory的问题解决
解决的方案是利用pyinstaller的hook特性,步骤如下: 1.在项目目录新建hooks目录,目录中新建hooks-scrapy.py 文件,文件内容如下: from PyInstaller.u ...
- 【西北大学2019新生赛】序列排序II
原题: 想了很久,想的是模仿冒泡,从大到小检查每一个数后面的数是否都与它互质,然后把它设为1(等价于放到最后不考虑) 然后一直想数据结垢 出来跟人交流,“这不是挺典型的思维题么哈哈哈” 利用性质: 调 ...
- PHP 二维数组排序函数的应用 array_multisort()
<?php $arrayData = array( array("name"=>"泰山", "age"=>"23 ...
- Python 字节码bytecode
字节码bytecode python把源码文件编译成字节码文件,存放在__pycahe子目录内,用.pyc结尾.之后如果不再修改源码文件,运行时则使用*.pyc文件编译成机器码,这样不但运行速度快,而 ...