网站大量收购独家精品文档,联系QQ:2885784924

uCOSii中断处理过程详解(一).docVIP

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

一.?? UCOSII的中断过程简介 系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。 由于UCOS II是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。 二.UCOSII的中断过程的示意图 三.具体中断过程 1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。 2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。 3.通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接 加1。 4.If(OSIntNesting==1) {OSTCBCur-OSTCBStrPtr=SP;} //如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中 5.清中断源,否则在开中断后,这类中断将反复的打入,导致系统崩贵 6.执行用户ISR 7.中断服务完成后,调用OSIntExit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间. 8.恢复所有CPU寄存器的值. 9.执行中断返回指令. ? 四.相关代码 ????? ??与编译器相关的数据类型: ??????? typedef unsigned char BOOLEAN; ??????? typedef unsigned char INT8U; ??????? typedef unsigned int OS_STK; //堆栈入口宽度为16 位 (一) void? OSIntEnter (void)的理解 uCOS_II.H中定义: #ifdef?? OS_GLOBALS #define? OS_EXT #else #define? OS_EXT? extern #endif???? //定义全局宏OS_EXT #ifndef? TRUE #define? TRUE?? 1 #endif ??? ????????? OS_EXT? BOOLEAN?? OSRunning; //定义外部BOOLEAN类型全局变量,用来指示 //核是否在运行 ??????????? OS_EXT? INT8U?? OSIntNesting;//定义外部8位无符号整型数全局变量,用来表 ???????????????????????????????????????? //示中断嵌套层数 OS_CORE.C中的OSIntEnter()函数原型: void? OSIntEnter (void) { ?? ??????????????????if (OSRunning == TRUE) //如果内核正在运行则进入if { ??????? ??????????????????????if (OSIntNesting 255) //如果嵌套层数小于255,则可以继//续 { ?????????? ???????????????????????????OSIntNesting++; //嵌套层数加1 ?????? ????????????????????????????} ?? ????????????????????????} } ?? ?? ??? ?(二)在中断服务子程序中加if ( OSIntNesting == 1){…}的原因??????????? uCOS_II.H中定义: typedef struct os_tcb { ????????????? OS_STK??? *OSTCBStkPtr;//声明指向任务堆栈栈顶的16位指针 ?? ……………… } OS_TCB;//定义名为OS_TCB的结构体数据类型,即任务控制块的数据结构 OS_EXT? OS_TCB?? *OSTCBCur;//声明一个指向任务控制块的全局指针变量 ?????????????????????????? //用于指向当前任务的任务控制块 中断服务程序中添加的代码: if ( OSIntNesting == 1) { ????????? ????????????OSTCBCur-OSTCBStkPtr = SP; // 如果是第一层中断,则将被中断任务??????? ?????????????????????????????????

文档评论(0)

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

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

1亿VIP精品文档

相关文档