嵌入式系统及应用:uCOS-II原理3_中断与时钟

上传人:努力****83 文档编号:189207313 上传时间:2023-02-21 格式:PPT 页数:10 大小:203.50KB
返回 下载 相关 举报
嵌入式系统及应用:uCOS-II原理3_中断与时钟_第1页
第1页 / 共10页
嵌入式系统及应用:uCOS-II原理3_中断与时钟_第2页
第2页 / 共10页
嵌入式系统及应用:uCOS-II原理3_中断与时钟_第3页
第3页 / 共10页
点击查看更多>>
资源描述
C/OS-C/OS-的中断和时钟的中断和时钟 本章主要内容:C/OS-II系统 响应中断的过程C/OS-II系统响应中断的过程为:系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。注意!中断服务子程序运行结束之后,系统将会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不是一定要接续运行被中断的任务的。中断请求中断请求关闭中断关闭中断转到中断向量转到中断向量保存保存CPUCPU寄存器寄存器通知内核退出通知内核退出ISRISRISRISR给任务发信号给任务发信号中断返回中断返回恢复恢复CPUCPU寄存器寄存器中断响应中断响应中断恢复中断恢复中断恢复中断恢复任务响应时间任务响应时间任务响应时间任务响应时间中断的响应过程中断的响应过程无新高级任务则无新高级任务则返回原任务返回原任务通知内核退出通知内核退出ISRISR恢复恢复CPUCPU寄存器寄存器中断返回中断返回有新高级任务则有新高级任务则运行高级任务运行高级任务通知内核进入通知内核进入ISRISRvoid OSIntEnter(void)if(OSRunning=TRUE)if(OSIntNesting 0)OSIntNesting-;/中断嵌套层数计数器减一中断嵌套层数计数器减一 if(OSIntNesting=0)&(OSLockNesting=0)OSIntExitY=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(OSIntExitY OSTCBStkPtr;/SP指向待运行任务堆栈用出栈指令把用出栈指令把R1,R2,弹入弹入CPU的通用寄存器;的通用寄存器;RETI;/中断返回,使PC指向待运行任务应用程序中的临界段 在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段叫做临界段。因此,为了使临界段在运行时不受中断所打断,在临界段代码前必须用关中断指令使CPU屏蔽中断请求,而在临界段代码后必须用开中断指令解除屏蔽使得CPU可以响应中断请求 由于各厂商生产的CPU和C编译器的关中断和开中断的方法和指令不尽相同,为增强C/OS-II的可移植性(即在C/OS-II的各个C函数中尽可能地不出现汇编语言代码),C/OS-II用两个宏来实现中断的开放和关闭,而把与系统的硬件相关的关中断和开中断的指令分别封装在这两个宏中:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()第一种方法最简单,即直接使用处理器的开中断和关中断指令来实现宏,这时需要令常数OS_CRITICAL_METHOD=1。其示意性代码为:#define OS_ENTER_CRITICAL()asm(“DI”)关中断#define OS_EXIT_CRITICAL()asm(“EI”)开中断 第二种方法稍微复杂一些,但可以使CPU中断允许标志的状态,在临界段前和临界段后不发生改变。在宏OS_ENTER_CRITICAL()中,把CPU的允许中断标志保持到堆栈中,然后再关闭中断,这样在临界段结束时,即在调用宏OS_EXIT_CRITICAL()时只要把堆栈中保存的CPU允许中断状态恢复就可以了。这两个宏的示意性代码如下:#define OS_ENTER_CRITICAL()asm(“PUSHPSW”)/*通过保存程序状态字来保存中 断允许标志*/asm(“DI”)/关中断#define OS_EXIT_CRITICAL()asm(“POPPSW”)/恢复中断允许标志 C/OS-II的系统时钟C/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(Time Tick)。硬件定时器以时钟节拍为周期定时地产生中 断,该 中 断 的 中 断 服 务 程 序 叫 做OSTickISR()。中断服务程序通过调用函数OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。void OSTickISR(void)保存CPU寄存器;调用OSIntEnter();/记录中断嵌套层数if(OSIntNesting=1;OSTCBCur-OSTCBStkPtr=SP;/保存堆栈指针调用调用OSTimeTick();/节拍处理清除中断;开中断;调用OSIntExit();/中断嵌套层数减一 恢复CPU寄存器;中断返回;这是系统时钟中断服务程序void OSTimeTick(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;OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX;else ptcb-OSTCBDly=1;ptcb=ptcb-OSTCBNext;OS_EXIT_CRITICAL();时钟节拍服务函数函数OSTimeTick()的任务,就是在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态。任务的延时 由于嵌入式系统的任务是一个无限循环,并且C/OS-II还是一个抢占式内核,所以为了使高优先级别的任务不至于独占CPU,可以给其他任务优先级别较低的任务获得CPU使用权的机会,C/OS-II规定:除了空闲任务之外的所有任务必须在任务中合适的位置调用系统提供的函数OSTimeDly(),使当前任务的运行延时(暂停)一段时间并进行一次任务调度,以让出CPU的使用权。void OSTimeDly(INT16U ticks)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif if(ticks 0)OS_ENTER_CRITICAL();if(OSRdyTblOSTCBCur-OSTCBY&=OSTCBCur-OSTCBBitX)=0)OSRdyGrp&=OSTCBCur-OSTCBBitY;/取消当前任务的就绪状态 OSTCBCur-OSTCBDly=ticks;/延时节拍数存入任务控制块 OS_EXIT_CRITICAL();OS_Sched();/调用调度函数 这是系统提供的延时函数 其他用来管理时间的函数 INT8U OSTimeDlyResume(INT8U prio);INT32U OSTimeGet(void);void OSTimeSet(INT32U ticks);取消任务延时函数获得系统时间函数设置系统时间函数
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!