中断是指在程序运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程。

  中断服务函数(ISR)是应中断请求而运行的程序。

  中断向量就是中断服务函数(ISR)的入口地址,即存储中断服务函数的内存地址的首单元。

  在ucos-II中,如果任务在运行中,系统接收到中断请求,并且这时中断响应是打开的,那么系统就会中止正在运行的程序,再按照中断向量的指向转而去执行中断服务程序。中断程序运行完后,系统会引发一次系统调度(OSIntExt()),转而去执行当前优先级别最高的就绪任(不一定是接着运行被中断的任务)。

但是,螳螂捕蝉,黄雀在后。中断服务函数本身也能被其他更高优先级的中断源发出的中断请求中断,这叫做中断嵌套。ucos-II中定义了一个用于记录中断嵌套层数的全局变量OSIntNesting。每当响应一个中断请求的时候,OSIntNesting+1。

  细心的读者可能会发现,上文中提到,在中断服务程序结束后,会引发一次系统调度,而负责这次调度的函数并不是我们在ucos-II的任务一章中提到的OSSched()。下面就来解释一下为什么会出现这种情况。因为ucos-II中定义了两个任务调度器,一个是任务级的调度器(OSSched()),另一个就是中断级的调度器(OSIntExt())。我们再来回忆一下任务级的调度器(OSSched())的工作过程。首先,其要确定任务调度器没有被上锁(OSLockNesting == 0)并且任务的没有进入服务函数(OSIntNesting == 0),当满足的情况下,才找出优先级最高的就绪任务,如果它不是当前任务的话,那么将其任务控制块指针给指向当前最高优先级就绪任务的指针(OSTCBHighRdy),接着调用任务级任务切换函数(OS_TASK_SW())进行任务切换。那么退出中断服务程序(OSIntExit())的时候,我们调用中断级的任务切换函数(OSIntCtxSw())来进行任务的切换。退出中断函数和任务级的任务调度器的功能差不多相同,不同点只是退出中断函数使OSIntNesting先减1,然后再判断任务调度器没有被上锁(OSLockNesting == 0)并且任务的没有进入服务函数(OSIntNesting == 0),其次是调用的任务切换函数不同,一个是任务级的切换函数   OS_TASK_SW(),而另一个是中断级的任务切换函数OSIntCtxSw()。

  OSIntExt的作用?OS_TASK_SW()和OSIntCtxSw()的区别?难道仅仅是因为OSIntCtxSw()调用了RETI(中断返回指令,是PC指向待运行的函数)?其恢复断点数据的过程是否相同?

  在编写中断服务程序时,要用到两个重要的函数OSIntEnter()和OSIntExit()。OSIntEnter()经常在中断服务程序保护被中断任务的中断数据之后,运行用户服务代码之前调用。其作用很简单,就是给全局变量OSIntNesting+1。而OSIntExit()的功能在上面已经说过了,就是进行任务的切换。

有的时候我们在执行某些代码的时候,不希望被中断函数打断。那么我们是否可以让中断在只有被允许的情况下才能被响应呢?很幸运,ucos-II给我们提供了两个这样的宏,宏OS_ENTER_CRITICAL()用来关闭中断。宏OS_EXIT_CRITICAL()用开打开中断。而在OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()中间的部分,我们称其为临界段。这样,当我们执行一些不希望被打断的代码时候,我们可以先关闭中断,当代码执行完毕后,再打开中断。

  ucos-II中的中断大体上就是如上的过程,当然,随着以后的深入。也会有更加详细的描述。

uC/OS-II中的中断(转)的更多相关文章

  1. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  2. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  3. 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II

    SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...

  4. uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()

    1. OSTaskCreate()    OSTaskCreate()建立一个新任务,能够在多任务环境启动之前,或者执行任务中建立任务.注意,ISR中禁止建立任务,一个任务必须为无限循环结构.    ...

  5. uc/os iii移植到STM32F4---IAR开发环境

    也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...

  6. 【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理

    LES BX, DWORD PTR DS:_OSTCBCur ;OSTCBCur->OSTCBStkPtr = SS:SP!!! ], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制 ...

  7. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

  8. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  9. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

随机推荐

  1. Qt 错误汇集贴

    错误: D:\qtprojects\mycom\mycom\mainwindow.cpp:23: error: no matching function for call to 'MainWindow ...

  2. hdu 4535 吉哥系列故事——礼尚往来

    http://acm.hdu.edu.cn/showproblem.php?pid=4535 错排公式:a[i]=(i-1)*(a[i-2]+a[i-1]): #include <cstdio& ...

  3. tesseract-ocr图片识别开源工具

    tesseract-ocr图片识别开源工具 今天看同事的ppt,提到了图片识别,又tesseract-ocr,觉得不错,试一下,如果效果好可以用来做验证码的识别 http://code.google. ...

  4. [转载]memcached stats 命令

    STAT pid 1552 STAT uptime 3792 STAT time 1262517674 STAT version 1.2.6 STAT pointer_size 32 STAT cur ...

  5. MYSQL存储过程,清除指前缀的定表名的数据

    MYSQL存储过程,清除指前缀的定表名的数据 DELIMITER $$ DROP PROCEDURE IF EXISTS `drop_table`$$ ),)) BEGIN ) DEFAULT NUL ...

  6. [Qt] Mask 蒙版

    [Qt] Mask 蒙版 Mask能够覆盖在其他的widget上面,实现一些动态图片的加载效果.下面给出代码. mask.h #ifndef MASK_HJ #define MASK_HJ #incl ...

  7. js的意义,引用方法及变量

    一 JavaScript的意义. Javascript是浏览器端的脚本语言,它能够访问web页面的元素和运行它得浏览器,从而可以操作元素,创建新的元素等.它主要的作用有: 1.以指定尺寸.位置和样式( ...

  8. java(17) - 增强for循环、装箱拆箱、可变参数

    一.增强型for循环: 语法格式: 打印: A B C D E 当遍历集合或数组时,如果需要访问集合或数组的下标时,最好使用旧的方法来便利或循环,而不要用增强型for循环,因为它丢失了下标信息. 对于 ...

  9. 在jsp页面上直接打开PDF文件

    1.在不需要使用插件,直接打开通过链接方式打开 <%@ page language="java" import="java.util.*,java.io.*&quo ...

  10. 关于SQL中数据类型(float和real)和 .NET Framework 中数据类型(float和double)的问题

    今天同学写程序遇到一个问题,MSSQL里的数据是 float 类型,在 .NET Framework 中用的时候也转换成 float 类型,结果报错,类型转换异常,明明是相同的类型,为什么会异常 在w ...