中断的上下半部

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

前言

因为输入类设备的输入都是异步事件,因此一般使用中断来处理和响应。

中断处理程序处于中断上下文中,不能和用户空间数据交互(不能使用copy_to(from)_usr函数);中断处理程序不能交出CPU(不能休眠、不能schedule);ISR运行时间尽可能短,越长则系统响应特性越差。

一、中断上下半部

当中断处理程序比较长时,为了提高响应特性,linux内核处理中断的方案是:人为地将处理程序分为两部分,即中断上半部、中断下半部。其中中断上半部标记中断,调度下半部;下半部负责真正的操作(比如读取按键键值、从网卡读取缓冲数据等)。

二、中断下半部的两种实现机制

1、tasklet机制(小任务机制)

(1)tasklet机制的目的

tasklet机制的引入,主要是考虑到支持SMP,提高SMP多个cpu的利用率(不同的tasklet可以在不同的cpu上运行)。

(2)tasklet机制的特点

tasklet属于中断上下文,因此不能被阻塞,不能睡眠,不能被打断。 

2、workqueue机制(工作队列机制)

(1)workqueue机制的特点

workqueue的突出特点是下半部会交给worker thead,因此下半部处于进程上下文,可以被重新调度,可以阻塞,也可以睡眠。

(2)workqueue的初始化方式 

静态初始化:调用宏DECLARE_WORK,初始化中断的上半部,然后在中断上半部调用schedule_work()来启动中断下半部 。

动态初始化:调用宏INIT_WORK,初始化中断的上半部,然后在中断上半部调用queue_work()启动我们的中断下半部 。

3、如何选择中断下半部的实现机制

(1)必须立即进行紧急处理极少量任务放入在中断的顶半部中

  • 此时屏蔽了与自己同类型的中断,由于任务量少,所以可以迅速不受打扰地处理完紧急任务(除非优先级比自己高,被抢占了)。

(2)需要较少时间的中等数量的急迫任务放在tasklet中

  • 此时不会屏蔽任何中断(包括与自己的顶半部同类型的中断),所以不影响顶半部对紧急事务的处理;
  • 同时又不会进行用户进程调度,从而保证了自己急迫任务得以迅速完成。

(3)需要较多时间且并不急迫(允许被操作系统剥夺运行权)的大量任务放在workqueue中

  • 此时操作系统会尽量快速处理完这个任务,但如果任务量太大,期间操作系统也会有机会调度别的用户进程运行,从而保证不会因为这个任务需要运行时间将其它用户进程无法进行。

(4)可能引起睡眠的任务放在workqueue中

  • 因为在workqueue中睡眠是安全的。在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,用workqueue很合适。

三、tasklet机制示例

1、tasklet相关接口介绍

2、代码示例

static irqreturn_t button_interrupt(int irq, void *dummy) 
{ int flag;s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0));		// input模式flag = gpio_get_value(S5PV210_GPH0(2));s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0f));		// eint2模式input_report_key(button_dev, KEY_LEFT, !flag);input_sync(button_dev);return IRQ_HANDLED; 
}

使用方案的策略:

四、workqueue机制示例

include/linux/workqueue.h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片播放器小项目(详解)

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。一、开始动手写代码 1、Makefile介绍 (1)这是一个通用的项目管理的Makefile体系,自己写的(有子文件夹组织的)项目可以…

Telnet远程访问思科交换机、路由器

一、实验目的Telnet远程访问思科交换机、路由器二、实验拓扑三、实验步骤1、PC1远程管理S11)配置交换机的管理IPS1(config)#int vlan 1S1(config-if)#ip add 192.168.1.100 255.255.255.0S1(config-if)#no shu2)开启S1的telnet远程管理服务S1(config)#li…

[置顶]       cocos2d-x 手游源码站

尊重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/37829061 1、魔幻方块 链接:魔幻方块源码关键词:魔幻方块源码 源代码 Cocos2d-x2.0 游戏源码 益智 休闲 游戏 游戏类型&#xf…

Android SDK开发包国内下载地址

原帖地址:http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/2769409.html 不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像…

SharePoint 2013 Workflow - Advanced Workflow Debugging with Fiddler

来自:Andrew Connell [MVP SharePoint] | 时间:2012-07-18 19:26:30 原文链接: http://www.andrewconnell.com/blog/archive/2012/07/18/sharepoint-2013-workflow-advanced-workflow-debugging-with-fiddler.aspx In previous posts Iv…

java sheet 打印区域设定,如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)...

如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)问题描述 (Problem Description)如何使用Java设置电子表格的打印区域。解决方案 (Solution)以下是使用Java设置电子表格打印区域的程序。import java.io.File;import java.io.Fi…

RedHat6.2 x86手动配置LNMP环境

为什么80%的码农都做不了架构师?>>> 因为公司要求用RedHat配,顺便让我练习一下Linux里面的操作什么的。 折腾来折腾去终于搞好了,其实也没那么难嘛。但是也要记录一下。 首先,是在服务器里面用VMware搭建的RedHat6.2 …

《c语言深度剖析》读书笔记

一、注意点 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 二、问题 1、 2、 3、 4、 5、 6、 7、

androidpn的一次亲密接触(二)

简单看了一下源码的实现,这里贴一点个人觉得比叫重要的代码。 XmppManager.java 构造方法:Java代码public XmppManager(NotificationService notificationService) 在这里主要是从共享引用中取得xmpp服务器地址和端口号、用户名和密码。 内部类Java代码…

指针知识学习[总]

printf("p %p.\n", p); // %p打印指针和%x打印指针,打印出的值是一样的 printf("p 0x%x.\n", p); 一、指针是什么? 1、指针变量和普通变量的区别 指针的实质就是个变量,它跟普通变量没有任何本质区别。指针完整的名字…

php excel 分页,excel分页线怎么增加

增加excel分页线的方法:首先依次点击“工作簿视图-分页预览”;然后点击要在其下方插入分页符的这一行;最后在“页面布局”选项卡上的“页面设置”组中,单击“分隔符”即可。本文操作环境:Windows7系统,Micr…

C# 中的委托和事件

PDF 浏览:http://www.tracefact.net/Document/Delegates-and-Events-in-CSharp.pdf文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报…

php7 有ext skel吗,PHP扩展开发系列02 - 老司机起步之函数

上一篇扩展开发引导文章中。创建了编写扩展的三个基本文件。或许你会有个疑问PHP没有类似的自动生成项目框架的工具吗? 当然有。这篇文章就开始介绍使用 "php-ext-cli" 工具来生成扩展项目文件注意这里的 "php-ext-cli" 本身没有这玩意&#xf…

(转载)说说char

char一直都在使用并且大量的使用,但是,大部分都是在单一平台上,那样没有太多的问题,在windows上大量直接使用wchar_t来解决中文的问题。并且在使用跨平台时也大多直接使用了Qt的QString来节省了很多的麻烦,但是现在项目…

WPF 正確理解ContentPresenter

2019独角兽企业重金招聘Python工程师标准>>> 我們先由下圖來看類層次,可知ContentControl繼承Control,ContentPresenter繼承FrameworkElement(Control也繼承FrameworkElement); 同樣的,ItemsControl繼承Control,ItemsPresenter繼承FrameworkElement. 在Control類並…

java动态交叉表,SqlServer如何生成动态交叉表查询

为了说明问题,我们用SqlServer自带的事例数据库(Northwind)来进行验证,所有的例子请放到Northwind中运行,我可能会省略Use语句,所引用的表,都是Northwind中的,下面我就不再说明了这里指的交叉表&#xff0c…

Canvas Clock

这两天在看html5的canvas,实现了上面那个东西 需要注意的地方: 1.canvas的sava()和restore()理解和使用 2.canvas的translate scale rotate ..的使用,每个变化都应该清楚圆心和角度..看:http://blog.sina.com.cn/s/blog_8fab526c01015tqs.htm…

CentOS 6.3 下用ntfs-3g挂载Windows NTFS分区

2019独角兽企业重金招聘Python工程师标准>>> 默认情况下,CentOS 6.3不支持Widows NTFS硬盘分区读写,要想把NTFS格式的磁盘挂载到CentOS 6.3下面需要安装第三方的插件ntfs-3g,这里我们采用编译安装插件。 1、安装编译器&#xff0c…

C++的const修饰

2019独角兽企业重金招聘Python工程师标准>>> C的const修饰 ‍const的两个用途‍ (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值. const的好处 (1)便于进行类型检查,…

心率变异性 matlab,心率变异性好的功率谱分析方面的问题

本帖最后由 天路 于 2018-2-25 21:16 编辑本人正在学习心率变异性方面的内容,但是按照文献上的方法做出来的结果并不是很理想,文献上说的是心率变异性的频率的范围是0.4以内,但是我做的功率谱上显示频率分布在整个频域内,试了很多…