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, ...
随机推荐
- Microsoft Deployment Toolkit 2013 Preview Release Now Available
MDT 2013 provides a common console with comprehensive tools and guidance for every organizational ro ...
- android 中文 api (71) —— BluetoothServerSocket[蓝牙]
前言 本章内容是 android.bluetooth.BluetoothServerSocket,为Android蓝牙部分的章节翻译.服务器通讯套接字,与TCP ServerSocket类似.版本为 ...
- JavaSript模块化 && AMD CMD 详解.....
模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题进行系统性的分解以之处理.模块化是一种处理复杂系统分解为代码结构更合理,可维护性更高的可管理的模块的方式.可以想象一个巨大 ...
- iOS 项目中的NSNotification简单使用
iOS中NSNotification的简单使用 好久没有写过博客了,总是遇到问题查一下,今天查的又是一个老问题,想了想,还是记录一下!今天在项目开发中遇到一个配置及时性处理的问题,想了想之后决定用通知 ...
- 经典排序算法及python实现
今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...
- GDB调试精粹及使用实例
一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符 ...
- poj 1664 put apples(dfs)
题目链接:http://poj.org/problem?id=1664 思路分析:数据较小,考虑深度优先搜索搜索解空间. 代码如下: #include <iostream> using n ...
- 如何提高banner设计含量--网上的一篇文章--感悟
"修改": 本质上是改什么?改大小?图片?文字?颜色? 老板说:修改本质上是提高“设计含量”.检测一个作品设计含量的高低,可以将作品中每一个设计元素进行分析,看它的“属性”与“操作 ...
- UVA610 - Street Directions(Tarjan)
option=com_onlinejudge&Itemid=8&category=153&page=show_problem&problem=551"> ...
- Java开源内容管理CMS系统J4CMS的几个样式
www.j4cms.com java 开源内容管理 页面直接编辑 bootstrap3 样式 default 样式 metro 样式 oschina 样式 leblog 样式 foundation 样 ...