中断和时钟机制演示文稿_第1页
中断和时钟机制演示文稿_第2页
中断和时钟机制演示文稿_第3页
中断和时钟机制演示文稿_第4页
中断和时钟机制演示文稿_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中断和时钟机制演示文稿本文档共32页;当前第1页;编辑于星期三\1点0分中断和时钟机制本文档共32页;当前第2页;编辑于星期三\1点0分本章主要内容:本文档共32页;当前第3页;编辑于星期三\1点0分μC/OS-II系统响应中断的过程

系统接收到中断请求后,如果中断未关闭,系统就会中止正在运行的当前任务,按照中断向量转而去运行ISR。 当ISR运行结束,系统将会返回到被中止的任务继续或者转向另一个具有更高优先级别的就绪任务。

本文档共32页;当前第4页;编辑于星期三\1点0分系统中断中断就是内核控制的任务在运行过程中,应内部或外部异步事件的请求,中止当前任务的运行,转去处理异步事件所要求的任务或处理的过程。中断服务程序(InterruptServiceRoutine)就是应中断请求而运行的子程序。简称为ISR。中断向量指中断服务子程序ISR的入口地址,即起始地址。本文档共32页;当前第5页;编辑于星期三\1点0分中断请求关闭中断转到中断向量保存CPU寄存器通知内核退出ISRISR给任务发信号中断返回恢复CPU寄存器中断响应中断恢复中断恢复任务响应时间任务响应时间中断的响应过程无新高级任务则返回原任务通知内核退出ISR恢复CPU寄存器中断返回有新高级任务则运行高级任务通知内核进入ISR本文档共32页;当前第6页;编辑于星期三\1点0分本章分为内核中断管理及其结构,系统时钟实现方法,时间管理模块的基本结构与功能,基本服务与接口函数,及其设计与调用方法,相关应用实例程序分析等。将µC/OS-II内核时间模块与中断与时钟管理功能进行组合的原因在于,两个模块的功能和性能是密切相关的,中断管理是时间管理的基础。本文档共32页;当前第7页;编辑于星期三\1点0分uC/OS-II内核中CPU能够响应中断的条件,可以理解为以下两个部分:一是至少有一个中断源向CPU发出中断信号,二是内核及应用系统允许中断,即未屏蔽中断信号。μC/OS-II内核中的时钟中断技术分为系统中断与系统时钟节拍两个部分组成。本文档共32页;当前第8页;编辑于星期三\1点0分系统时钟节拍

时钟节拍是特定的周期性中断,也称时钟中断,这个中断可以看作是系统心脏的脉动。操作系统通过时钟中断来确定时间间隔,实现时间的延时及确定任务超时。中断之间的时间间隔取决于不同的应用,一般在10~200ms之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时提供等待超时的依据。时钟节拍频率越快,系统额外开销越大。系统定义了32位无符号整数OSTime来记录系统启动后时钟节拍数。用户程序必须在多任务系统启动以后开启时钟节拍计时,在应用程序中调用系统函数OSStart()之后。μC/OS-II中的时钟节拍服务通过在时钟节拍中断服务子程序中调用OSTimeTick()实现。

本文档共32页;当前第9页;编辑于星期三\1点0分μC/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(TimeTick)。硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR()。中断服务程序通过调用函数OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。本文档共32页;当前第10页;编辑于星期三\1点0分时钟节拍中断服务子程序voidOSTickISR(void){

保存处理器寄存器的值;

调用OSIntEnter()或是将OSIntNesting加1;

调用OSTimeTick();

调用OSIntExit();

恢复处理器寄存器的值;

执行中断返回指令;

}

本文档共32页;当前第11页;编辑于星期三\1点0分OSTimeTick()函数μC/OS-II时钟中断服务程序的核心是调用OSTimeTick()函数。OSTimeTick()函数用来判断延时任务是否延时结束从而将其置于就绪态。其程序伪代码如下:

voidOSTimeTick(void){

OSTimeTickHook();/*调用用户定义的时钟节拍外连函数*/

while{ /*(除空闲任务外的所有任务)*/

OS_ENTER_CRITICAL(); /*关中断*/

对所有任务的延时时间递减;

扫描时间到期的任务,并且唤醒该任务;

OS_EXIT_CRITICAL(); /*开中断*/

指针指向下一个任务;

}

OSTime++; /*系统计时时间加1*/

}本文档共32页;当前第12页;编辑于星期三\1点0分uC/OS-II内核对于以上中断响应及中断处理过程,使用以下若干系统函数实现中断与内核之间的控制管理和联系,这些函数分别是:中断的进入函数OSIntEnter()中断的退出函数OSIntExit()中断服务子程序ISR中断级任务切换函数ISR的任务切换函数OSIntCtxSw()本文档共32页;当前第13页;编辑于星期三\1点0分voidOSIntEnter(void){if(OSRunning==TRUE) {if(OSIntNesting<255) {

OSIntNesting++; //中断嵌套层数计数器加1}}}本文档共32页;当前第14页;编辑于星期三\1点0分本文档共32页;当前第15页;编辑于星期三\1点0分voidOSIntExit(void){if(OSRunning==TRUE){OS_ENTER_CRITICAL();if(OSIntNesting>0) {OSIntNesting--; //中断嵌套层数计数器减1

}

if((OSIntNesting==0)&&(OSLockNesting==0)){OSIntExitY=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OSIntCtxSw();}}OS_EXIT_CRITICAL();}}本文档共32页;当前第16页;编辑于星期三\1点0分Searchforhighestpriority–similartoschedulerHalfcontextswitchisdonebyinterruptresponse–i.e.registerssaved本文档共32页;当前第17页;编辑于星期三\1点0分

在中断服务程序中调用的负责任务切换工作的函数OSIntCtxSw()叫做中断级任务切换函数

本文档共32页;当前第18页;编辑于星期三\1点0分OSIntCtxSw(){OSTCBCur=OSTCBHighRdy; //任务控制块的切换

OSPrioCur=OSPrioHighRdy;SP=OSTCBHighRdy->OSTCBStkPtr; //SP指向待运行任务堆栈,用出栈指令把R1,R2,……存入CPU通用寄存器;RETI; //中断返回,PC指待运行任务}本文档共32页;当前第19页;编辑于星期三\1点0分参见core.c中关于中断进入和退出的调用的定义core.c关于中断及辅助功能的设计与实现技术voidOSIntEnter(void)voidOSIntExit(void)voidOSSchedLock(void)voidOSSchedUnlock(void)本文档共32页;当前第20页;编辑于星期三\1点0分μC/OS-II的系统时钟本文档共32页;当前第21页;编辑于星期三\1点0分voidOSTickISR(void){

保存CPU寄存器; 调用OSIntEnter(); //记录中断嵌套层数

if(OSIntNesting==1; { OSTCBCur->OSTCBStkPtr=SP; //保存堆栈指针

}

调用OSTimeTick(); //节拍处理 清除中断; 开中断; 调用OSIntExit(); //中断嵌套层数减1

恢复CPU寄存器; 中断返回;}

这是系统时钟中断服务程序本文档共32页;当前第22页;编辑于星期三\1点0分voidOSTimeTick(void){ ……OSTimeTickHook(); ……OSTime++; //记录节拍数

……if(OSRunning==TRUE){ptcb=OSTCBList;while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){OS_ENTER_CRITICAL();if(ptcb->OSTCBDly!=0) {if(--ptcb->OSTCBDly==0)//任务的延时时间减一

{if((ptcb->OSTCBStat&OS_STAT_SUSPEND)==OS_STAT_RDY) {OSRdyGrp|=ptcb->OSTCBBitY;OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;}else{ptcb->OSTCBDly=1;}}}ptcb=ptcb->OSTCBNext;OS_EXIT_CRITICAL();}}

时钟节拍服务函数本文档共32页;当前第23页;编辑于星期三\1点0分函数OSTimeTick()的任务,就是在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态。

本文档共32页;当前第24页;编辑于星期三\1点0分

任务的延时

这是系统提供的延时函数本文档共32页;当前第25页;编辑于星期三\1点0分

嵌入式系统的任务是一个无限循环,μC/OS-II是一个抢占式内核,为了使高优先级任务不独占CPU,μC/OS-II规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly(),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出CPU的使用权。

本文档共32页;当前第26页;编辑于星期三\1点0分

其他用来管理时间的函数

INT8UOSTimeDlyResume(INT8Uprio);INT32UOSTimeGet(void);voidOSTimeSet(INT32Uticks);

取消任务延时函数获得系统时间函数设置系统时间函数本文档共32页;当前第27页;编辑于星期三\1点0分voidOSTimeDly(INT16Uticks){if(ticks>0){OS_ENTER_CRITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0) {OSRdyGrp&=~OSTCBCur->OSTCBBitY; //取消当前任务的就绪状态

}OSTCBCur->OSTCBDly=ticks; //延时节拍数存入任务控制块OS_EXIT_CRITICAL();OS_Sched(); //调用调度函数

}}本文档共32页;当前第28页;编辑于星期三\1点0分OSTimeDlyHMSM()函数任务延迟函数OSTimeDly()需要确定延时时间对应的时钟节拍。利用全局常数设定OS_TICKS_PER_SEC值,将时间转换成时钟节拍数,参见文件OS_CFG.H。µC/OS-Ⅱ内核提供OSTimeDlyHMSM()函数,可以按小时(H)、分(M)、秒(S)和毫秒(ms)来定义延迟时间。本文档共32页;当前第29页;编辑于星期三\1点0分结束任务延时函数OSTimeDlyResume()

有时嵌入式软件根据设计要求,需要根据特定条件,提前结束任务的延时,即任务的延时并未到时,就唤醒该任务,将任务的状态转到就绪。嵌入式操作系统内核应提供这一功能。µC/OS-Ⅱ内核允许用户结束正处于延时时限范围内的任务。延时任务可以不等待延时时限到时,而是通过其它任务调用结

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论