QNX驱动开发——中断处理(转载)
原文网址:http://blog.csdn.net/daniellee_ustb/article/details/7841894
在操作系统中,对于中断的处理一直是一件麻烦事,其实主要是对操作系统的中断管理机制不熟悉。当中断产生时,内核去执行中断服务程序ISR,中断服务程序中要做尽量少的工作,以提高系统执行效率,有些人在中断服务程序中使用延时函数和printf函数和malloc函数,其实是很不可取的。延时函数不仅大大降低了中断执行的效率,也可能会屏蔽下次中断的产生,从而丢失对中断的响应。对于printf函数为什么不行呢?可以从输出原理上进行解释。通过调用Printf函数,将字符串输出到console的时候要调用到串口,这里涉及到身躯信号量以及阻塞操作,会加大中断服务程序的执行时间;malloc是不可重入函数,如果在其还没返回就再对其调用将出现灾难性后果。为了尽量减少中断服务程序执行的时间,减小调度等待时间,那么在操作系统中ISR最好的实现方式就是,发生中断时,设置标志,构造一个尽量简短的ISR,其他工作单独创建相应的线程去执行。就好比有人给你打电话,当你突然接到任务指示时是一边听电话一边花大量时间做完,还是挂掉电话再去做具体的任务呢?当然是后者了,可是大部分人还是选择把所有的事情都放在中断服务程序中去处理,其实是很不科学的。
当硬件产生中断后,会一直将中断线拉高,直到ISR清中断。然而如果中断服务程序忘记清除中断标志,那么当中断程序执行完时,PIC又会因检测到中断而重复执行,这样就出问题了!所以好的方法就是一进入中断程序就先清除中断标志。
那么在QNX中如何写一个中断呢?QNX提供了两种连接中断的方法:
Int InterruptAttachEvent (int intr, const struct sigevent *event, unsigned flags);
Int InterruptAttach (int intr, const struct sigevent * (*handler) (void *arg, int id), const void *area, int size, unsigned flags);
其中int intr代表了中断向量号,在startup中初始化PIC的时候按照数据手册写进去的,代表了哪个中断发生时会执行相应的ISR。
首先看看第一个函数,InterruptAttachEvent,这个函数告诉系统在硬件发生中断时要返回一个event来指出由哪个线程去执行具体任务,当然在这个线程中要先屏蔽这个中断源以免在任务还没处理完的时候再次发生中断。当调用这个函数的时候与查询的机制类似,其主干如下所示:
struct sigevent event;
intId = InterruptAttachEvent (HW_SERIAL_IRQ, &event, 0);
thread_a()
{
for(;;){
InterruptWait (0, NULL);
InterruptUnmask (HW_SERIAL_IRQ, intId);//get next event
ClearInterruptStatus();
Dosth();
}
}
当中断发生时,InterruptWait都会捕获到event,再针对不同的任务进行相应的处理。可是对于上边提到的主干程序,可能会有所疑问,为什么刚发现中断就去打开中断屏蔽呢,而不是等中断之行完再说呢?考虑到如果一个硬件产生的速度比较快,那么我们先处理在打开中断屏蔽就有可能对丢失对中断的处理。这里边InterruptWait可以将所有收到的event排成队列,对于不及时处理的中断请求稍后再做处理,这就很好的解决了上述问题。
再看第二个函数,InterruptAttach,这个函数在发生中断时直接调用了handler这个中断处理函数,是真正的ISR,在函数中使用的全局变量要使用volatile关键字修饰,告诉编译器这是一个会在中断中和其他线程中改变的变量,对其的一切操作都要去源地址进行读取,否则会出现错误。这个函数为什么要返回一个event呢,因为这样可以唤醒相应的线程去做具体的事情。
那么对于这两个函数哪个更好一点呢?显然每个函数都有自己的优缺点,视具体情况而定。InterruptAttachEvent(),用法简单,运行在用户空间,可以激发单独的线程去处理特定的任务,可是虽然好用,每当中断时都会引起上下文切换,降低了效率。对于InterruptAttach(),因为是ISR将原线程中断,产不产生新的进程由ISR决定,所以对于不是自己要处理的中断,可以减少上下文切换的开支。
QNX驱动开发——中断处理(转载)的更多相关文章
- Windows驱动开发VS2012 DDK/WDK的环境配置
[开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/articl ...
- Linux驱动开发必看详解神秘内核(完全转载)
Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入L ...
- 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发
[序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...
- 行为驱动开发iOS <收藏>
前段时间在design+code购买了一个学习iOS设计和编码在线课程,使用Sketch设计App,然后使用Swift语言实现Designer News客户端.作者Meng To已经开源到Github ...
- Linux驱动开发概述
原文出处:http://www.cnblogs.com/jacklu/p/4722563.html Linux设备分类 设备的驱动程序也要像裸机程序那样进行一些硬件操作,不同的是驱动程序需要" ...
- 【转】基于V4L2的视频驱动开发
编写基于V4L2视频驱动主要涉及到以下几个知识点:1> 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等.2> Camera解码器.控制器 ...
- Windows驱动——读书笔记《Windows驱动开发技术详解》
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- linux驱动之中断处理过程汇编部分
linux系统下驱动中,中断异常的处理过程,与裸机开发中断处理过程非常类似.通过简单的回顾裸机开发中断处理部分,来参考学习linux系统下中断处理流程. 一.ARM裸机开发中断处理过程 以S3C244 ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
随机推荐
- java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
我现在用的是hibernate3.6final,出现了下面这个异常:(当我使用@ManyToOne时,不会出现异常,而且用@ManyToMany也正常) Caused by: java.lang.No ...
- leetCode 24. Swap Nodes in Pairs (双数交换节点) 解题思路和方法
Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For exa ...
- android项目 之 记事本(6)----- 加入手写
想必大家都用过QQ的白板功能,里面主要有两项,一个是涂鸦功能,事实上类似于上节的画板功能,而还有一个就是手写,那记事本怎么能没有这个功能呢,今天就来为我们的记事本加入手写功能. 先上图,看看效果: 看 ...
- libevent入门
Libevent API =============================== evtimer_new evtimer_new(base, callback, NULL) 用来做定时器,即当 ...
- Extending your SharePoint 2007 site with Microsoft ASP.NET AJAX 3.5
After ASP.NET 3.5 has been installed you need to modify the web.config file of your MOSS web site wi ...
- asp.net根据模版生成Word小记
最近遇到一个问题,客户提了一个新的需求,客户想要将显示在网页上的数据导出成Word进行套打,由于之前没有接触过这一块的内容,自己写的系统也没有使用这种功能,现在重头学习. 具体思路: 1.先制作Wor ...
- php随笔11-Thinkphp常用系统配置大全
Thinkphp常用配置 CHECK_FILE_CASE -- windows环境下面的严格检查大小写. /* 项目设定 */ 'APP_DEBUG' => false, // ...
- 用jmeter进行多用户并发压力测试 [转]
近日manager要求对项目进行压力测试,开始对jmeter进行了研究.jmeter是Apache一个开源项目,可对各种项目进行测试,甚至包括junit. 测试要求如下,多用户同时登陆web应用程序, ...
- 转: 如何实现jQuery的Ajax文件上传
[PHP文件上传] 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的.实际上,在这里不管是PHP,JSP,还是ASP处理上传的文件,其实都是WEB早已把文件上传到服务器了,我们只是运用上 ...
- BZOJ 1631: [Usaco2007 Feb]Cow Party
题目 1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 491 Solved: 362[Sub ...