嵌入式-4.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式-4

第四章 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(); //中

文档评论(0)

shuwkb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档