在设计软件与外设交互时,需要考虑以下三个方面:

  • 怎样检出外设的事件,是使用中断还是轮询?
  • 使用中断时,哪些处理在中断服务程序中执行,哪些处理在应用程序中执行?
  • 中断服务程序怎样与应用程序通信?

软件与外设的交互,基本有两种模式:轮询和中断。轮询是由软件定时地查询外设的各种寄存器,检查该外设是否有事件发生,如有事件发生,则执行相应的动作。中断则通过使能该外设的中断,当相应的事件发生时,MCU产生中断,调用对应的中断处理函数,由中断服务程序完成必要的处理后,将事件或数据通知应用程序,从而达到通知软件的目的。采用轮询方式时,为了不丢失外设的事件,需要非常频繁地查询外设的状态。如果需要轮询的外设较多时,会导致系统整体的运行效率降低。考虑到CPU与外设之间的速度差,如果涉及到与外设通信,一般采用中断的方式:只有当外设完成了数据发送或者接收,才中断CPU,获得处理,这样可以保证CPU的处理效率达到最高。

由于中断服务程序的优先级高于所有的任务,当有中断发生时,MCU将会临时停止当前应用程序的运行,保存运行上下文(当前的PC寄存器、堆栈寄存器等),调用相应的中断服务程序。中断服务程序运行结束后,MCU会恢复被停止应用程序的运行上下文,从停止处开始继续执行。而且,当一个外设的中断服务程序在运行时,其他外设的中断(在支持中断嵌套的系统中比其优先级低的中断)必须等待,如果等待时间过长,可能会导致事件或数据丢失。因此为了不影响其它中断的处理,同时对应用程序运行的影响尽量小,中断服务程序必须尽量短小精悍,在尽可能短的时间内完成动作。

当中断服务程序需要完成的处理较多时,操作系统提供了延迟中断处理的机制。操作系统管理一个用于延迟中断处理的任务,其优先级高于所有的任务,但低于所有的中断。从应用程序的角度看,中断服务程序和延迟中断处理是连续执行的,没有被打断;但从中断服务程序的角度看,耗时的处理被延迟到了一个任务当中,从而对其它外设中断处理的延迟可以达到最小化。图 1‑1是一个使用中断延迟处理的执行序列的例子。

在图 1中,中断1的优先级高于中断2,在应用任务执行过程中,中断1发生,挂起当前应用任务,执行其中断服务程序。在执行过程中,中断2发生,由于其优先级较低,因此中断2的服务程序的执行被延迟。直到中断1服务程序执行结束,开始执行中断2的服务程序。当中断2的服务程序执行结束后,中断延迟处理任务开始执行,依次处理中断1和2的延迟中断处理。等所有延迟中断处理结束后,挂起的应用任务继续执行。

图 1 中断处理的执行顺序

当然,如果操作系统没有提供中断延迟处理的机制,在采用抢占式调度机制的系统中,也可以用普通任务模拟实现,只要赋予该任务最高优先级即可。

一般嵌入式操作系统都会提供一系列中断服务程序专用的API,包括与任务通信(传递事件或消息)、同步等。因为中断服务程序不允许被阻塞,这些API需要保证在中断服务程序中即时运行,不会等待。如在FreeRTOS中,用于中断服务程序的API都以FromISR结束;在RTX中,都以isr_开头。非常容易识别。

如果操作系统没有提供中断服务程序专用的API,则在使用时,需要非常小心地设置API的参数,以避免中断处理函数被阻塞,比如向任务的消息队列发送消息时,必须保证队列满时立即返回,而不是等待。

嵌入式操作系统的任务调度如果是抢占式调度策略,则在从终端服务程序退出前,需要考虑是否需要触发任务调度。因为由于中断服务程序与应用程序间的通信,原先一些处于等待状态的任务可能变成了准备执行的状态,因此需要重新调度,找到最高优先级的任务执行。而触发任务调度的策略在不同的操作系统中是不同的,基本上有以下三种策略:

  • 一种是不需要用户在写中断服务程序时作任何特别的处理,比如RTX。在中断服务程序中调用中断服务程序专用的API时,操作系统判断是否需要触发任务调度,如果需要,则直接触发。
  • 一种是要求在退出中断服务程序之前调用一个操作系统的特殊API,比如uCOSII,在所有中断服务程序的最后,需要调用OSIntExit()。在该API中操作系统判断是否需要触发任务调度,并作相应的触发处理。
  • 还有一种是操作系统通过参数通知中断服务程序是否需要触发任务调度,比如FreeRTOS。在FreeRTOS中,某些中断服务程序专用的API中有一个参数pxHigherPriorityTaskWoken,用于指示在调用相应的API之后是否需要执行任务调度。同时还提供了执行任务调度的API portYIELD_FROM_ISR()供中断服务程序使用。需要注意的是,即使pxHigherPriorityTaskWoken指示需要触发任务调度,中断服务程序根据当前的执行上下文,可以不执行任务调度。这给用户提供了更多的自由度,以优化执行流程。这可以避免不必要的任务调度动作,也给用户更多的控制执行流程的手段。

因此,在写中断服务程序时,特别是选用类似FreeRTOS之类操作系统时,需要考虑是否触发任务调度,以及在必要时触发任务调度。如果遗漏了任务调度的触发,在绝大部分情况下可能没有问题,极难定位和调试。

嵌入式开发之中断服务程序相关推荐

  1. 嵌入式中的中断服务程序

    嵌入式中的中断服务程序 中断是嵌入式系统中重要的组成部分,但是在标准 C 中不包含中断.许多编译开发商在标准 C 上增加了对中断的支持,提供新的关键字用于标示中断服务程序(ISR),类似于__inte ...

  2. 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...

    <嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...

  3. 为什么说嵌入式开发比单片机要难很多?工程师谈谈自己的感悟

    单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈本人对这两个概念的理解和感悟. 首先明确概念,什么是单片机,单片机是一种集 ...

  4. windowsCE异常和中断服务程序初探

    windowsCE异常和中断服务程序初探 ---------by nasiry 转载请说明出处 1.中断/异常相量的装入和执行方式. 中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行 ...

  5. 为什么说嵌入式开发比单片机要难很多?

    单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈本人对这两个概念的理解和感悟. 首先明确概念,什么是单片机,单片机是一种集 ...

  6. windowsCE异常和中断服务程序初探(-)

    1.中断/异常相量的装入和执行方式. 中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序.而事件服务程序的入口点就是中断/异常向量所在的位置.arm的中 ...

  7. 嵌入式基础(1)---硬件知识,搞嵌入式开发必备

    嵌入式基础硬件知识,搞嵌入式开发必备 做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解. 这样才能深入的研究下去.下面我们简单的介绍嵌入式开发中的一些硬件相关的概念. ...

  8. 理解嵌入式开发中的一些硬件相关的概念

    为什么80%的码农都做不了架构师?>>>    做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解.这样才能深入的研究下去.下面我们简单的介绍嵌入式开发 ...

  9. 嵌入式开发学习笔记9-做一个好玩的LED闪烁

    嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...

最新文章

  1. Xtrabackup备份、还原、恢复Mysql操作大全
  2. oracle v$sql last_load_time,Oracle 等待事件V$视图
  3. [WorldWind学习]12.WavingFlags和WavingFlagLayer
  4. html 文字只设计一段颜色,html – sphinx,reassuredtext:为单个字设置颜色
  5. vue 公用组件开发 确认框confirm
  6. java: 程序包com.github.pagehelper不存在_Rust语言正在兴起,Java、Python、C的末日来临?...
  7. Memcached 简单应用
  8. Java-java.io.BufferedInputStream
  9. python--二叉树库函数
  10. [原创]Java开发如何在线打开Word文件
  11. 山寨qq java_MTK手机QQjava版本山寨qq2009通用版
  12. SQL19 查找所有员工的last_name和first_name以及对应的
  13. Python求解一元二次方程根
  14. Problem G: 测量湖泊的平均水深
  15. java牛奶订购系统,Java IO系统
  16. 珞珈-B生所学 跟学笔记 PPT(一)
  17. 基于51单片机 + ds12c887 + ds18b20 + lcd1602的时钟温度显示器(带闹钟功能)
  18. vue项目中如何设置ico图标
  19. html5进行游戏开发
  20. MCS-51实现静态数码管的显示

热门文章

  1. hp6960无法连接计算机,win10系统连接惠普6960无线打印机的方法【图文详解】
  2. 路面附着系数估计_无迹 扩展卡尔曼滤波(UKF/EKF) 采用无迹/扩展卡尔曼滤波UKF进行路面附着系数估计,可实现“不变路面,对接路面和对开路面”等工况的路面附着系数估计
  3. E:\python项目\图片处理PopenCV>pip install opencv-pythonRequirement already satisfied: opencv-python in e:
  4. 王道计算机网络课代表 - 考研计算机 第三章 数据链路层 究极精华总结笔记
  5. 自考计算机科技与技术停考,突发!这些自考专业停考!
  6. windows安全中心发现威胁怎么处理?
  7. html5调颜色浏览器不显示,pyecharts画中国地图(省、市):如何调整渐变颜色、浏览器中大小、生成的HTML打开是空白无法显示的问题...
  8. matlab中conv2函数
  9. ai域名在哪里注册?
  10. 八年phper的高级工程师面试之路八年phper的高级工程师面试之路