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, ...
随机推荐
- 利用Linux命令行进行文本按行去重并按重复次数排序
最近杂事太多,正事进展缓慢.Fighting! linux命令行提供了非常强大的文本处理功能,组合利用linux命令能实现好多强大的功能.本文这里举例说明如何利用Linux命令行进行文本按行去重并按重 ...
- Spark学习体系
底理解Spark,能够分为以下几个层次. 1 Spark基础篇 1.1 Spark生态和安装部署 在安装过程中,理解其基本操作步骤. 安装部署 Spark安装简单介绍 Spark的源代码编译 Spar ...
- 用nodejs安装hexo,将hexo部署到github
跌跌撞撞写这篇博文,希望下一篇可以好点 运行环境:最新版本的nodejs + git 安装好nodejs 和 git ,注册好github账号,新建仓库****.github.io(****为gith ...
- 集合ArrayList案例
1.添加元素,读取 ArrayList n = new ArrayList(); n.Add();//集合中添加元素用Add,分别添加了1,2 n.Add(); foreach (int a in n ...
- java之内存可见型
1.可见性的概念 一个线程对于共享变量的修改,能够及时被其他的线程看到. 2.什么是共享变量 一个变量在多个线程中的工作内存中都存在变量副本,那么这个变量在这几个线程之间共享. 3.Java线程的工作 ...
- 裸机离奇事件:Freescale usb 有关fault
裸机离奇事件:Freescale usbucosiiFreescale\KSDK_1.2.0\examples\twrk65f180m\demo_apps\usb\host\cdc\cdc_seria ...
- Software Version --hdu1976
#include using namespace std; int main() { int T; cin>>T; int a1,b1,c1; int a2,b2,c2; while(T- ...
- 个人自建网店(WordPress WooCommerce on SAE)集成支付宝支付
插件: Alipay For WooCommerce 到支付宝账户的商家服务提出申请: https://b.alipay.com/order/serviceIndex.htm 在"在线签约- ...
- Regex阅读笔记(五)java操作篇
首先一个demo程序 Java的正则表达式包为java.util.regex,主要是使用其中的Pattern和Matcher. groupCount方法时候都可调用,而大多数方法都必须在匹配尝试成功之 ...
- Zookper
http://blog.csdn.net/yangbutao/article/details/11669609 http://www.oschina.net/code/snippet_255033_2 ...