原文网址: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驱动开发——中断处理(转载)的更多相关文章

  1. Windows驱动开发VS2012 DDK/WDK的环境配置

    [开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/articl ...

  2. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

  3. 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发

    [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...

  4. 行为驱动开发iOS <收藏>

    前段时间在design+code购买了一个学习iOS设计和编码在线课程,使用Sketch设计App,然后使用Swift语言实现Designer News客户端.作者Meng To已经开源到Github ...

  5. Linux驱动开发概述

    原文出处:http://www.cnblogs.com/jacklu/p/4722563.html Linux设备分类 设备的驱动程序也要像裸机程序那样进行一些硬件操作,不同的是驱动程序需要" ...

  6. 【转】基于V4L2的视频驱动开发

    编写基于V4L2视频驱动主要涉及到以下几个知识点:1> 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法.各种参数的配置方法.信号输出类型等.2> Camera解码器.控制器 ...

  7. Windows驱动——读书笔记《Windows驱动开发技术详解》

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  8. linux驱动之中断处理过程汇编部分

    linux系统下驱动中,中断异常的处理过程,与裸机开发中断处理过程非常类似.通过简单的回顾裸机开发中断处理部分,来参考学习linux系统下中断处理流程. 一.ARM裸机开发中断处理过程 以S3C244 ...

  9. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

随机推荐

  1. 数学之路-python计算实战(16)-机器视觉-滤波去噪(邻域平均法滤波)

    # -*- coding: utf-8 -*- #code:myhaspl@myhaspl.com #邻域平均法滤波,半径为2 import cv2 import numpy as np fn=&qu ...

  2. Android JNI入门第三篇——jni头文件分析

    一. 首先写了java文件: public class HeaderFile { private native void  doVoid(); native int doShort(); native ...

  3. OutLook 2010 收件箱子文件夹收到新邮件时没有桌面通知

    开始---规则----管理规则和通知 规则和通知---电子邮件规则---批量选择账号---更改规则---在新邮件通知和窗口显示(选中)---确定 录入通知邮件消息---确定 效果如下:

  4. virtual 关键字

    virtual 关键字用于修饰方法.属性.索引器或事件声明,并且允许在派生类中重写这些对象.例如,此方法可被任何继承它的类重写. public virtual double Area() { retu ...

  5. django开发简易博客(五)

    这一节将讲述如何添加comments库与ajax的支持. 一.添加comments库 comments库是是django框架内置的一个评论库,可以快速的搭建岀一个评论系统,不过再自定义方面有些麻烦,不 ...

  6. C语言宏的特殊用法和几个坑(转)

    总结一下C语言中宏的一些特殊用法和几个容易踩的坑.由于本文主要参考GCC文档,某些细节(如宏参数中的空格是否处理之类)在别的编译器可能有细微差别,请参考相应文档. 宏基础 宏仅仅是在C预处理阶段的一种 ...

  7. 如何正确地在手机上显示图片——QImage与QPixmap完全解析

    引言 用Qt程序在手机上显示一幅图片对编程人员来说是再基础不过的一件事情了.那么先让大家看两段代码: //dangerous should not be used, cannot display ea ...

  8. IT第八天 - 类的应用、debug、项目开发模式优化

    IT第八天 上午 类的应用 1.对象在实例化时是非常耗费系统资源的,因此要尽量减少new字段的使用 2.类的初始值是null,在使用未实例化的类时,很容易导致报错:NullExceptionPoint ...

  9. poj 2346 Lucky tickets(区间dp)

    题目链接:http://poj.org/problem?id=2346 思路分析:使用动态规划解法:设函数 d( n, x )代表长度为n且满足左边n/2位的和减去右边n/2位的和为x的数的数目. 将 ...

  10. HDU4731+找规律

    规律题!!! /* */ #include<algorithm> #include<iostream> #include<string.h> #include< ...