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 ...
随机推荐
- Struts标签<s:if>判断字符串是否包含一个固定的值
Struts标签<s:if>判断字符串是否包含一个固定的值:1.如果比较对象是字符串: <s:if test="str.contains('判断是否包含的字符串')&quo ...
- CSS3弹性盒子(Flex Box)
CSS3弹性盒子(Flex Box) 一.容器的属性:flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content 1 ...
- flask 反向解析示例
1 静态网页 和动态网页 1 静态网页:无法与服务器做动态交互的网页 2 动态网页:允许与服务器做动态加护的 2 WEB 与 服务器 1 WEB :网页(HTML,css,JS) 3 服务器的作用: ...
- 通用mapper的增删改查方法 留存 备忘
Mybatis通用Mapper介绍与使用 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ...
- C#在代码中编写输出debug信息-类Debug的使用
文章:C# 的两种debug 方法 文章:C#跟踪和调试程序-Debug类使用 很全面的文章,可以仔细学习使用下. 文章:C#调试类 没有仔细看. 关键字:Debug类和Trace类有什么区别? 微软 ...
- 什么是OAuth授权
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...
- 0002SpringBoot整合Junit
前提条件:SpringBoot已经整合了Mybatis,至于SpringBoot如何整合Mybatis可参考我的上一篇文章 SpringBoot为什么要整合Juni? SpringBoot整合了Jun ...
- 下载uhd_images_downloader出现报错
下载uhd_images_downloader出现报错 [INFO] Images destination: /usr/local/share/uhd/images [INFO] No invento ...
- [译] 尤雨溪:Vue 3.0 计划
[译] 尤雨溪:Vue 3.0 计划 原文:Plans for the Next Iteration of Vue.js作者:Evan You 发表时间:Sep 30, 2018译者:西楼听雨 发表时 ...
- c语言1博客作业10
一.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/10101 ...