欢迎来到天天文库
浏览记录
ID:37648192
大小:1013.45 KB
页数:15页
时间:2019-05-27
《嵌入式操作系统ucosII的中断处理过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Snippet2013-04-0906:51嵌入式操作系统ucosII的中断处理过程(上篇)转一.UCOSII的中断过程简介系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。由于UCOSII是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。二.
2、UCOSII的中断过程的示意图三.具体中断过程1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。3.通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接加1。4.If(OSIntNesting==1){OSTCBCur->OSTCBStrPtr=SP;}/嵌入式操作系统ucosII的中断处理过程(上篇)转_王文罗的空...http://
3、hi.baidu.com/wangwenluo2gxy/item/da2da05e701c2bdb...四.相关代码与编译器相关的数据类型:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefunsignedintOS_STK;//堆栈入口宽度为16位(一)voidOSIntEnter(void)的理解uCOS_II.H中定义:#ifdefOS_GLOBALS#defineOS_EXT#else#defineOS_EXTextern#endif//定义全局宏OS_E
4、XT#ifndefTRUE#defineTRUE1#endifOS_EXTBOOLEANOSRunning;//定义外部BOOLEAN类型全局变量,用来指示//核是否在运行OS_EXTINT8UOSIntNesting;//定义外部8位无符号整型数全局变量,用来表//示中断嵌套层数OS_CORE.C中的OSIntEnter()函数原型:voidOSIntEnter(void){if(OSRunning==TRUE)//如果内核正在运行则进入if{if(OSIntNesting<255)//如果嵌套层数小于255,则可以继//续{第
5、2页共11页2013/11/1322:38嵌入式操作系统ucosII的中断处理过程(上篇)转_王文罗的空...http://hi.baidu.com/wangwenluo2gxy/item/da2da05e701c2bdb...OSIntNesting++;//嵌套层数加1}}}(二)在中断服务子程序中加if(OSIntNesting==1){…}的原因uCOS_II.H中定义:typedefstructos_tcb{OS_STK*OSTCBStkPtr;//声明指向任务堆栈栈顶的16位指针………………}OS_TCB;//定义名为
6、OS_TCB的结构体数据类型,即任务控制块的数据结构OS_EXTOS_TCB*OSTCBCur;//声明一个指向任务控制块的全局指针变量//用于指向当前任务的任务控制块中断服务程序中添加的代码:if(OSIntNesting==1){OSTCBCur->OSTCBStkPtr=SP;//如果是第一层中断,则将被中断任务//的堆栈指针保存在被中断任务的任务//任务控制块中}关于uCOS-II的中断服务程序(ISR)中必须加“OSIntNesting==1”的原因==避免调整堆栈指针. 出现这个问题的根源是当低优先级的任务被中断,当中
7、断完成后由于有高优先级的任务就绪,则必须调度高优先级的任务,原来的低优先级任务继续被中断着,但是此时的低优先级任务的堆栈已经被破坏,已不能被调度程序直接调度了,要想被调度而必须调整堆栈指针。如下图所示的场景:问题分析: 要想理解加上上面两句的原因,不妨假设有下面场景出现:voidMyTask(void){...}该任务在执行过程中被中断打断,下面是它的服务子程序voidMyISR(void){第3页共11页2013/11/1322:38嵌入式操作系统ucosII的中断处理过程(上篇)转_王文罗的空...http://hi.ba
8、idu.com/wangwenluo2gxy/item/da2da05e701c2bdb...保存现场(PUSHA)OSIntEnter();//此时的堆栈指针是正确的,再往下就不对了,应该在此处保存用户任务堆栈指针OSIntExit();恢复现场
此文档下载收益归作者所有