欢迎来到天天文库
浏览记录
ID:21651752
大小:1.11 MB
页数:28页
时间:2018-10-20
《μcos-ii的中断和时钟》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式实时操作系统uC/OS-II的原理与应用东软IT人才实训中心Copyright2008ByNeusoftGroup.Allrightsreserved第三章uC/OS-II的中断和时钟目标:本章旨在向学员介绍uc/osII实时操作系统的中断概念及时间管理,通过本章的学习,学员应该掌握如下知识:uC/OS-II的中断管理和中断服务程序的结构uC/OS-II的系统时钟及实现方法时间管理服务:延时、取消延时学时:6.0学时教学方法:讲授ppt+上机练习+点评+案例分析3.1uC/OS-II的中断中断:任务在运行过程中,应内部或外部异步事件的请求中止当前任务,而去处
2、理异步事件所要求的任务的过程叫做中断。中断服务程序:应中断请求而运行的程序叫中断服务子程序(ISR)。中断向量:中断服务子程序的入口地址叫中断向量。CPU响应中断的条件:至少有一个中断源向CPU发出中断信号系统允许中断,且对此中断信号未予屏蔽3.1.1uC/OS-II的中断过程uC/OS-II中断的响应过程:中断请求关闭中断转到中断向量保存CPU寄存器通知内核进入ISR并开中断通知内核退出ISR恢复CPU寄存器中断返回无新高级任务则返回原任务有新高级任务则运行高级任务ISR给任务发信号通知内核退出ISR恢复CPU寄存器中断返回图3-1中断的响应过程中断响应中断恢复
3、任务响应时间中断恢复任务响应时间注意:对于可剥夺型内核,中断服务子程序结束后,系统进行一次任务调度去运行优先级最高的就绪任务,而不是一定要接续运行被中断的任务。voidOSIntEnter(void){if(OSRunning==True){if(OSIntNesting<255){OSIntNesting++;}}}3.1.2中断的开始、离开voidOSIntExit(Void){OS_ENTER_CRITICAL();if(OSRunning==TRUE){if(OSIntNesting>0){OSIntNesting--;}if((OSLockNesting
4、==0)&&(OSIntNesting==0)){OSIntExity=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OSIntCtxSw();//中断级任务切换}}}OS_EXIT_CRITICAL();}进入中断嵌套层数=0?获得任务TCB的指针YESNONO返回中断服务程序未锁定调度器?NO获
5、得最高级别就绪任务的prio任务是被中断的任务?YESYES执行中断级任务切换图3-2函数OSIntExit()的流程图为记录中断嵌套的层数,定义了一个全局变量OSIntNesting。函数作用就是把全局变量OSIntNesting加1,从而用它来记录中断嵌套的层数这个函数在中断嵌套层数计数器为0、调度器未被锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下将要进行任务切换,否则就返回被中断的服务程序3.1.3中断服务子程序的流程中断服务子程序入口OSTCBCur->OSTCBStkPtr=SPNO中断嵌套层OSIntNEsting=1?YES清
6、中断源的中断申请标志图3-3中断服务子程序的流程图CPU寄存器内容进栈调用OSIntEnter()通知系统:进入中断服务程序重新开放中断运行中断服务代码调用OSIntExit()通知系统:退出中断服务程序恢复CPU寄存器内容执行中断返回指令在uC/OS-II中,通常用一个任务来完成异步事件的处理工作,而在中断服务程序中只是向任务发送消息的方法去激活这个任务。并非为每个任务都定义一个充分大的栈空间,中断嵌套时单独定义一个中断嵌套栈,在发生第1次中断时,中断服务程序将栈空间切换到中断嵌套栈,这样,以后发生的嵌套中断就一直使用这个栈空间。3.1.4中断级任务切换OSIn
7、tCtxSw(){OSTCBCur=OSTCBHighRdy;//任务控制块的切换OSPrioCur=OSPrioHighRdy;SP=OSPrioHighRdy->OSTCBStkPtr;//使SP指向待运行任务堆栈用出栈指令把R1、R2……弹入CPU的通用寄存器;RETI;//中断返回,使PC指向待运行任务}与任务级切换函数OSCtxSW()的原因一样,中断级任务切换函数OSIntCtxSw()通常是用汇编语言来编写的:3.1.5临界段在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码叫做临阶段。怎样保证临界段的安全?系统当有异步事件发生时会引
8、发中断请求
此文档下载收益归作者所有