中断处理程序的局限

1. 中断处理程序以异步的方式执行,并且它有可能会打断其他重要代码的执行,因此,为了避免被打段的代码停止时间过长,中断处理程序应该执行的越快越好;

2. 如果当前有一个中断处理程序在执行,在最好的情况下(没有设置IRQF_DISABLED),与该中断同级别的其他中断就会被屏蔽,在最坏情况下(设置了IRQF_DISABLED),当前处理器上所有其他中断都会被屏蔽;因为禁止中断后,硬件与操作系统无法通信,因此,中断处理程序执行的越快越好;

3. 由于中断处理程序往往需要对硬件进行操作,所以它们通常有很高的时限要求;

4. 中断处理程序不在进程上下文中运行,所以它们不能阻塞,这限制了它们所做的的事情;

下半部

下半部的任务就是执行与中断处理密切相关但是中断处理程序本身不执行的工作;在理想的情况下,最好是中断处理程序将所有工作都交给下半部执行,因为我们希望在中断处理程序中完成的工作越少越好,我们期望中断处理程序能够尽快的返回;

中断处理程序和下半部之间划分借鉴:

1. 如果一个任务对事件非常敏感,则将其放在中断处理程序中;

2. 如果一个任务和硬件相关,那么将其放在中断处理程序中;

3. 如果一个任务要保证不被其他中断(特别是同级中断)打断,那么将其放在中断处理程序中;

4. 其他所有任务,考虑放置在下半部执行;

下半部的方式和选择

下半部提供了三种实现方式:软中断、tasklet和工作队列;tasklet基于软中断实现,所以两者很接近;工作队列机制与它们完全不同,它靠内核线程实现;

软中断体用的执行序列化的保障最少,这就要求软中断处理函数必须格外小心地采取一些步骤确保共享数据的安全,两个甚至更多相同类型的软中断有可能在不同的处理器上同时执行;如果被考察的代码本身多线索化的工作做得非常好,比如网络子系统,它完全使用单处理器变量,那么软中断就是非常好的选择;对于时间要求严格和执行频率很高的应用来说,它执行得也最快;

如果代码多线索化考虑的并不充分,那么选择tasklet意义更大;它的接口非常简单,而且,由于两个同种类型的tasklet不能同时执行,所以实现起来也会简单一些;tasklet是有效的软中断,但不能并发执行;驱动程序开发者应当尽可能的选择tasklet而不是软中断;当然,如果准备利用每处理器变量,以确保软中断安全的在多个处理器上并发的运行,那么还是选择软中断;

如果需要把任务退后到进程上下文中完成,那么在这三者中就只能选择工作队列了,如果进程上下文并不是必须条件(也就是如果不需要睡眠),那么软中断和tasklet可能更合适;工作队列造成的开销最大,因为它要牵扯到内核线程甚至上下文切换;这并不是说工作队列效率低,如果每秒钟有几千次中断,那么其他机制可能更合适一些;

简单的说,一般驱动程序编写者需要做两个选择:首先,是不是需要一个可调度的实体来执行需要推后完成的工作-从根本上说,有休眠的需要吗?有,工作队列就是唯一选择;否则,最好用tasklet;要是必须专注性能的提高,那就考虑软中断;

Linux设备驱动程序 之 中断下半部的更多相关文章

  1. Linux设备驱动程序 之 中断

    中断 中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据:硬件设备生成中断并 ...

  2. Linux设备驱动程序 之 中断和锁

    中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq ...

  3. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  4. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  5. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  6. linux设备驱动程序--gpio控制

    gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...

  7. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  8. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  9. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

随机推荐

  1. MSPBSL_Scripter编译

    The BSL Scripter is a PC application that is available for Windows, Linux and Mac OS X. It is a user ...

  2. coding++ :MySQL函数——FIND_IN_SET()

    语法:FIND_IN_SET(str,strlist) 定义: 1). 假如字符串 str 在由N子链组成的字符串列表 strlist 中,则返回值的范围在1到N之间. 2). 一个字符串列表就是一个 ...

  3. Windows10关闭自动更新方法

    你在为windows10自动更新而烦恼吗?下面教你一招如何关闭自动更新

  4. PAT Basic 1055 集体照 (25 分)

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 /(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中间位 ...

  5. 二分法:从一个只包含数字的list中查找某个数

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/4/10 19:03 # @Author : MnCu # @Site : # ...

  6. Python+request 测试结果结合unittest生成测试报告《四》

    测试报告示例图:      目录结构介绍: 主要涉及更改的地方: 1.导入 Common.HTMLTestRunner2文件 2.run_test.py文件中新增测试报告相关的代码 具体代码实现: 1 ...

  7. halcon导出类---HDevWindowStack详解

    在HDevelop中编写好的程序在导出时,Halcon会帮我们转换成我们需要的语言,比如C++.例:HDevelop中有如下语句需要导出: dev_close_window() Halcon导出成C+ ...

  8. SVN(subversion )服务端和客户端的下载安装使用

    SVN(subversion)官方网站: http://subversion.apache.org/packages.html 一.服务端下载 1.百度搜关键字:subversion  进入subve ...

  9. JSONP劫持

    发出空refer的POC <!DOCTYPE html> <html> <head> <meta name="referrer" cont ...

  10. 选择排序之javascript

    选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放 ...