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 ...
随机推荐
- stm32 SysTick系统定时器
它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取 当定时器计数到0时,将从LOAD 寄存器 ...
- JS 百度地图 地图线路描绘
JS 百度地图 地图线路描绘 <script type="text/javascript" src="http://api.map.baidu.com/api?v= ...
- css-两个div并排,左边宽度固定右边自适应的布局 的实现方法
<div class= "container"> <div class="left"></div> <div clas ...
- idou老师教你学Istio06: 如何用istio实现流量迁移
流量迁移是流量管理的一个重要功能.istio提供的流量管理功能将流量从基础设施扩展中解耦,支持动态请求路由,故障注入.超时重试.熔断和流量迁移等.流量迁移的主要目的是将流量从微服务的某一版本的逐步迁移 ...
- PAT Basic 1089 狼人杀-简单版 (20 分)
以下文字摘自<灵机一动·好玩的数学>:“狼人杀”游戏分为狼人.好人两大阵营.在一局“狼人杀”游戏中,1 号玩家说:“2 号是狼人”,2 号玩家说:“3 号是好人”,3 号玩家说:“4 号是 ...
- SQL性能优化思路
1. 尽可能把数据的存储和计算放入Memory而不是Disk,且减少IO操作,比如运用Redis等缓存技术 2. 对数据表进行精心设计,特别是大数据表,对常用数据字段进行适当的冗余,尽可能避免分表导致 ...
- 有关PHPstorm的git环境的配置和git密钥的生成总结
phpstorm上配置git环境的配置总感觉很简单,没发现看似简单的东西浪费我好多时间.我在网上查了一下关于phpstorm的git环境的配置没有具体的总结 所以我把自己的配过程简单总结了一下 接下来 ...
- 转 oracle数据库更新时间字段数据时的sql语句
https://www.cnblogs.com/sun-rain/p/4921512.html ---Oracle数据库-时间函数 ---格式化时间插入update t_user u set u.mo ...
- C# 任务、线程、同步(二)
取消架构 1.Parallel.For()方法的取消 static void CancelParallelLoop() { var cts = new CancellationTokenSource( ...
- 省选模拟赛 Problem 3. count (矩阵快速幂优化DP)
Discription DarrellDarrellDarrell 在思考一道计算题. 给你一个尺寸为 1×N1 × N1×N 的长条,你可以在上面切很多刀,要求竖直地切并且且完后每块的长度都是整数. ...