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

  中断服务函数(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. 转: ubuntu配置NFS,挂载开发板

    ====================================== 命令: 1. $sudo apt-get install nfs-kernel-server           (安装N ...

  2. Update主循环、状态机的实现

    从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已. 游戏中存在一个帧的概念.   这个概念大家都知道,类比的话,它就是电影胶卷的 ...

  3. Altium Designer 等长线&&蛇形线

    Altium Designer 里面怎么画等长线 (1)一般是将走线布完后,新建一个class. Design -> Classes 如上图添加完后可以点击close. (2)快捷键 T + R ...

  4. keil #pragma disable

    μVision2 控制:这条命令不能在命令行使用,只能在源文件中使用. 功能:DISABLE 指令使得编译器在函数运行期间禁止所有中断产生.DISABLE命令必须在函数的前面以#pragma 参数的形 ...

  5. HDU_2021——最少RMB问题

    Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的 ...

  6. 数据加密算法---base64

    简介 base64是把8位字符打散,转换成不被人直接识别的形式,严格来说它并不是加密算法,只能算做一种编码方式 原理 首先准备64个字符数组做为“数组库” ['A', 'B', 'C', ... 'a ...

  7. 《SDN核心技术剖析和实战指南》第一章小结

    第一章主要是概况.新技术有一个特点是,每家都有不同的说法.这里我只说说我比较认同的部分. SDN的核心概念大概有两个:转发面与控制面分离.开发可编程化.书里还说逻辑上集中控制,其实这个就可以从转发与控 ...

  8. 对象拷贝类PropertyUtils,BeanUtils,BeanCopier的技术沉淀

    功能简介 对象拷贝的应用现状简介: 业务系统中经常需要两个对象进行属性的拷贝,不能否认逐个的对象拷贝是最快速最安全的做法,但是当数据对象的属性字段数量超过程序员的容忍的程度,代码因此变得臃肿不堪,使用 ...

  9. linux下的java远程调试jpda+tomcat

    项目放到linux服务器了,服务器的环境或者数据可能和我们本地不一样,这个时候我们可能需要远程的断点进行调试,来查看请求过程中的各个变量的值.这里我们的应用服务器用的tomcat5.5.17 这个时候 ...

  10. 为什么p标签不能嵌套div??

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...