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

  中断服务函数(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. ural 1333 Genie Bomber 2

    #include <cstdio> #include <cstring> #include <algorithm> #define maxn 200 using n ...

  2. 深入剖析keil c51 --- 从汇编到c51

    第一节 main()函数和启动代码 汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和 ...

  3. 黑马程序员_JavaIO流(二)

    字符流的缓冲区 缓冲区的出现提高了对数据的读写效率. 对应类: BufferedWriter BufferedReader 缓冲区要结合流才可以使用. 在流的基础上对流的功能进行了增强. Buffer ...

  4. Android ViewPager实现软件的第一次加载的滑动效果

    public class MainActivity extends Activity { private ViewPager viewPager; private List<View> V ...

  5. Linux grep 命令中的正则表达式详解

    在 Linux .类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢? Linux 附带有 GNU grep 命令工具,它支持扩展正则表达式(extended regular expres ...

  6. StoryBoard 页面传值

    如图新建一个viewController和DetailViewController VC 和DetailVC 联线的Idetnifier 设置为:GoDetailVC ViewController主要 ...

  7. zeptoJS:如何像jQuery一样,让滚动变得优雅?

    利用jQuery的animate() 方法,我们很容易实现滚动条的平滑滚动效果: $(function() { $('#top').click( function (e) { $('html, bod ...

  8. JAVA的RSA加密算法工具类

    须要用到一个jar http://www.bouncycastle.org/latest_releases.html 须要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密12 ...

  9. J2EE (十) 简洁的JSTL、EL

    简介 JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库. 由四个定制标记库(core.format.xml 和 sql)和一对通 ...

  10. ng-camera的API详解

    Camera github地址: apache/cordova-plugin-camera 安装 cordova plugin add cordoba-plugin-camera 项目中的使用