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

  中断服务函数(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. 安卓各文件存储路径汇总(Android file path)

    写下来,省得以后不记得到处翻: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /ca ...

  2. HttpCookie

    参考 : http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html 上文结尾有提到一个说法 4. HttpRequest.Cooki ...

  3. Android attrs.xml文件中属性类型format值的格式

    "reference" //引用 "color" //颜色 "boolean" //布尔值 "dimension" // ...

  4. Java实现SOAP协议 之 HelloWorld

    Java实现SOAP协议 之 HelloWorld SOAP是把基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起. 准备: 1. 准备一个web server.Tomcat 下载地址 h ...

  5. HDOJ 1302(UVa 573) The Snail(蜗牛爬井)

    Problem Description A snail is at the bottom of a 6-foot well and wants to climb to the top. The sna ...

  6. java中实现查看今天是星期几的代码实现

    public void getDate() { String[] weekDays = {"星期日", "星期一", "星期二", &quo ...

  7. B树——思路、及C语言代码的实现

    0.序 本人现读本科大二,这学期学习数据结构,老师为我们的期末作业布置一道任选题,而我一直以来都有听说B树是一棵挺神奇的树,所以我选择了它,当然更重要的原因是因为B树的难度最高,我喜欢做有挑战性的工作 ...

  8. (转)awk命令

    转自:http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2874788 整理:Jims of 肥肥世家 <jims.yang@g ...

  9. window+Apache 配置虚拟主机(2)

    1. 打开虚拟主机功能 2. 设置虚拟主机相应的文件夹 3. 将虚拟的域名绑定到127.0.0.1 4. 结果图: 记忆一下,突然感觉都忘记了!

  10. [Polymer] Introduction

    install Polymer and explore creating our first custom element: bower install polymer index.html: < ...