嵌入式-4.ppt
文本预览下载声明
第四章 uC/OS-II的中断和时钟 第4章 uC/OS-II的中断和时钟 本章旨在介绍uC/OS-II实时操作系统的中断概念及时间管理,通过本章的学习,应该掌握如下知识: ● uC/OS-II的中断管理和中断服务程序的结构 ● uC/OS-II的系统时钟及实现方法 ● 时间管理服务:延时、取消延时 4.1 uC/OS-II的中断 中断:任务在运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。 中断服务程序:应中断请求而运行的程序叫中断服务子程序(ISR)。 中断向量:中断服务子程序的入口地址叫中断向量。 CPU响应中断的条件: ● 至少有一个中断源向CPU发出中断信号 ● 系统允许中断,且对此中断信号未予屏蔽 4.1.1 uCOS-II的中断过程 uCOS-II系统响应中断的过程 系统处于中断允许响应状态(即中断是开放的) 系统接到中断请求 跳转到中断向量的地址去执行中断服务程序 中断向量空间都比较小,会有一条跳转语句,跳到中断服务程序对中断进行处理。 中断服务程序执行完毕后,进行中断返回时,根据当前就绪任务的优先级,选择返回至原先中断的任务中或安排更高就绪的任务运行—可剥夺型内核的特点 ucos-II系统允许中断的嵌套 ●中断嵌套—高优先级别的中断请求可以打断低优先级别中断的处理过程 ●为了记录中断嵌套的层数,ucos-II使用一个全局变量OSIntNesting来实现,中断的嵌套层数=255 中断响应的过程示意图如图所示: 注意:对于可剥夺型内核,中断服务子程序结束后,系统进行一次任务调度去运行优先级最高的就绪任务,而不是一定要接续运行被中断的任务。 在ucos-II中断服务程序用到两个函数OSIntEnter()与OSIntExit(),主要的功能是对中断层数进行维护,实现中断的嵌套处理。 OSIntEnter(): 进入中断函数,对中断的嵌套层数OSIntNesting+1,最多嵌套255层 函数在保存断点数据以后,执行中断服务程序之前调用 代码如下: void OSIntEnter (void) { if (OSRunning == TRUE) { if (OSIntNesting 255) { OSIntNesting++; /* 中断嵌套层数计数器加1 */ } } } 函数OSIntEnter( )的调用通常发生在中断服务程序保护了被中断任务的断点数据之后,运行用户中断服务程序之前,所以称之为“进入中断服务函数”。 OSIntExit(): 退出中断函数,对中断的嵌套层数OSIntNesting-1 对中断返回时将要运行的任务进行判断 同时具备以下3个条件时,运行调度器执行新的高优先级的任务,否则返回至原任务 中断计数器OSIntNesting=0,说明退出中断 调度器没有上锁 最高优先级的任务不是被(进入)中断的任务 OSIntExit( )的流程图如下图所示: 从流程图中可以看到,这个函数在中断嵌套层数计数器为0、调度器未被锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下将要进行任务切换,否则就返回被中断的任务程序 OSIntExit( )的代码如下: void OSIntExit (void) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif 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(); //中
显示全部