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 ...
随机推荐
- Docker启动Elasticsearch报错java.nio.file.AccessDeniedException
报错信息 Caused by: java.nio.file.AccessDeniedException: /usr/share/elasticsearch/data/nodes 问题分析 表面上是说容 ...
- RestControllerAdvice,ControllerAdvice
1.切记@RestControllerAdvice 和 @ControllerAdvice 不能放在common里,会不生效,还会引起子项目的全局异常失败. 所以这2个还是放在各自的子项目里去处理.一 ...
- 面试题之String s="a"+"b"+"c"+"d";
今天遇到了一个面试题的选择,我当时真的没怎么在意,其实挺好玩的. 1.这条语句String s="a"+"b"+"c"+"d&qu ...
- vulnhub攻略
https://www.vulnhub.com/entry/21ltr-scene-1,3/ 这个靶机国内https://www.cnblogs.com/hack404/p/11423228.html ...
- 嵌套的页面——自适应高度与跨越操作DOM
<div id="myIframeId"> <iframe ref="myIframe" name="odpIframeName&q ...
- selenium网页截图和截图定位(无界面)phantomjs
phantomjs是一款软件,需要重新安装. 参考: https://blog.csdn.net/liyahui_3163/article/details/79064108 案例代码: from se ...
- CentOS 7安装VMware Tools
1.启动centos,在此虚拟集中点击VMware Workstation中的虚拟机菜单,点击安装VMware Tools,如果已经安装过点击重新安装VMware Tools 2.查看/dev目录下文 ...
- Linux下的库文件搜索路径
对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行 ...
- c#系统预定义类型
- Flutter——Wrap组件(流式布局)
Wrap 可以实现流布局,单行的 Wrap 跟 Row 表现几乎一致,单列的 Wrap 则跟 Row 表现几乎一致.但 Row 与 Column 都是单行单列的,Wrap 则突破了这个限制,mainA ...