QNX驱动开发——中断处理_interruptattachevent-程序员宅基地

技术标签: QNX  嵌入式硬件  驱动开发  单片机  

转载: QNX驱动开发——中断处理_DanielLee_ustb的专栏-程序员宅基地

在操作系统中,对于中断的处理一直是一件麻烦事,其实主要是对操作系统的中断管理机制不熟悉。当中断产生时,内核去执行中断服务程序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决定,所以对于不是自己要处理的中断,可以减少上下文切换的开支。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/modi000/article/details/107957101

智能推荐

基于Kepler.gl 和 Google Earth Engine 卫星数据创建拉伸多边形地图-程序员宅基地

文章浏览阅读965次,点赞18次,收藏21次。现在我们有了 2021 年和 2023 年的 NDVI 数据帧,我们需要从 2021 年的值中减去 2023 年的值以捕获 NDVI 的差异。该数据集包括像素级别的植被值,我们将编写一个自定义函数来根据红色和绿色波段的表面反射率计算 NDVI。在我的上一篇文章中,我演示了如何将单个多边形分割/镶嵌为一组大小均匀的六边形。现在我们有了植被损失数据,让我们使用 Kepler.gl 可视化每个六边形的植被损失。将地图保存为 HTML 文件,在浏览器中打开 HTML 以获得更好的视图。现在我们将调用该函数并使用、

Echarts绘制任意数据的正态分布图_echarts正态分布图-程序员宅基地

文章浏览阅读3.3k次,点赞6次,收藏5次。正态分布,又称高斯分布或钟形曲线,是统计学中最为重要和常用的分布之一。_echarts正态分布图

Android中发送短信等普通方法_android bundle.get("pdus");-程序员宅基地

文章浏览阅读217次。首先要在Mainfest.xml中加入所需要的权限:[html] view plain copyprint?uses-permission android:name="android.permission.SEND_SMS"/> uses-permission android:name="android.permission.READ_SMS"/> _android bundle.get("pdus");

2021-07-26 WSL2 的安装和联网_wsl2 联网-程序员宅基地

文章浏览阅读2.6k次。0、说明最近在学习 Data Assimilation Research Testbed (DART) 相关内容,其软件是在 Unix/Linux 操作系统下编译和运行的 ,由于我的电脑是 Windows 10 的,DART 推荐可以使用 Windows Subsystem For Linux (WSL) 来创建一个 Windows 下的 Linux 子系统。以下的内容主要介绍如何安装 WSL2,以及 WSL2 的联网。1、如何在 Windows 10 下安装WSL具体的安装流程可以在 microso_wsl2 联网

DATABASE_LINK 数据库连接_添加 database link重复的数据库链接命-程序员宅基地

文章浏览阅读1k次。DB_LINK 介绍在本机数据库orcl上创建了一个prod_link的publicdblink(使用远程主机的scott用户连接),则用sqlplus连接到本机数据库,执行select * from scott.emp@prod_link即可以将远程数据库上的scott用户下的emp表中的数据获取到。也可以在本地建一个同义词来指向scott.emp@prod_link,这样取值就方便多了..._添加 database link重复的数据库链接命

云-腾讯云-实时音视频:实时音视频(TRTC)-程序员宅基地

文章浏览阅读3.1k次。ylbtech-云-腾讯云-实时音视频:实时音视频(TRTC)支持跨终端、全平台之间互通,从零开始快速搭建实时音视频通信平台1.返回顶部 1、腾讯实时音视频(Tencent Real-Time Communication,TRTC)拥有QQ十几年来在音视频技术上的积累,致力于帮助企业快速搭建低成本、高品质音视频通讯能力的完整解决方案。..._腾讯实时音视频 分享链接

随便推点

用c语言写个日历表_农历库c语言-程序员宅基地

文章浏览阅读534次,点赞10次,收藏8次。编写一个完整的日历表需要处理许多细节,包括公历和农历之间的转换、节气、闰年等。运行程序后,会输出指定年份的日历表。注意,这个程序只是一个简单的示例,还有很多可以改进和扩展的地方,例如添加节气、节日等。_农历库c语言

FL Studio21.1.1.3750中文破解百度网盘下载地址含Crack补丁_fl studio 21 注册机-程序员宅基地

文章浏览阅读1w次,点赞28次,收藏27次。FL Studio21.1.1.3750中文破解版是最优秀、最繁荣的数字音频工作站 (DAW) 之一,日新月异。它是一款录音机和编辑器,可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊。为方便用户,FL Studio 21提供三种不同的版本——Fruity 版、Producer 版和签名版。所有这些版本都是独一无二的,同样具有竞争力。用户可以根据自己的需要选择其中任何一种。FL Studio21.1.1.3750中文版可以说是一站式综合音乐制作单位,可以让您录制、作曲、混音和编辑音乐。_fl studio 21 注册机

冯.诺伊曼体系结构的计算机工作原理是,冯 诺依曼型计算机的工作原理是什么...-程序员宅基地

文章浏览阅读1.3k次。冯诺依曼计算机工作原理冯 诺依曼计算机工作原理的核心是 和 程序控制世界上不同型号的计算机,就其工作原理而言,一般都是认为冯 诺依曼提出了什么原理冯 诺依曼原理中,计算机硬件系统由那五大部分组成的 急急急急急急急急急急急急急急急急急急急急急急冯诺依曼结构计算机工作原理的核心冯诺依曼结构和现代计算机结构模型 转载重学计算机组成原理 一 冯 诺依曼体系结构从冯.诺依曼的存储程序工作原理及计算机的组成来..._简述冯诺依曼计算机结构及工作原理

四国军棋引擎开发(2)简单的事件驱动模型下棋-程序员宅基地

文章浏览阅读559次。这次在随机乱下的基础上加上了一些简单的处理,如进营、炸棋、吃子等功能,在和敌方棋子产生碰撞之后会获取敌方棋子大小的一些信息,目前采用的是事件驱动模型,当下完一步棋界面返回结果后会判断是否触发了相关事件,有事件发生则处理相关事件,没有事件发生则仍然是随机下棋。1.事件驱动模型首先定义一个各种事件的枚举变量,目前的事件有工兵吃子,摸暗棋,进营,明确吃子,炸棋。定义如下:enum MoveE..._军棋引擎

STL与泛型编程-第一周笔记-Geekband-程序员宅基地

文章浏览阅读85次。1, 模板观念与函数模板简单模板: template< typename T > T Function( T a, T b) {… }类模板: template struct Object{……….}; 函数模板 template< class T> inline T Function( T a, T b){……} 不可以使用不同型别的..._geekband 讲义

vb.net正则表达式html,VB.Net常用的正则表达式(实例)-程序员宅基地

文章浏览阅读158次。"^\d+$"  //非负整数(正整数 + 0)"^[0-9]*[1-9][0-9]*$"  //正整数"^((-\d+)|(0+))$"  //非正整数(负整数 + 0)"^-[0-9]*[1-9][0-9]*$"  //负整数"^-?\d+$"    //整数"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0..._vb.net 正则表达式 取html中的herf