uCOS-I中断服务程序代码分析.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
uCOS-I中断服务程序代码分析

uC/OS-II中断服务程序代码分析 在讲解uC/OS-II中断处理机制之前,大家要了解uC/OS-II中对于中断函数的处理机制。我们在查阅《嵌入式实时操作系统μCOS-II(第二版)》书中P103页时,可以查看到在uC/OS-II中的中断处理机制如下描述: Void ISP_Function( void ) { 保存全部的CPU寄存器; 调用OSIntEnter()或OSIntNesting++; If(OSIntNesting == 1 ) { OSTCBCur-OSTCBStkPtr= SP ; } 清中断源; 重新打开中断; 执行用户代码做中断服务; 调用OSIntExit(); 恢复所有CPU寄存器; 执行中断返回指令; } 在uC/OS-II中,对于中断中的任务切换,是用两个函数实现的 1、OSIntEnter() 2、OSIntExit() 在OSIntEnter()中将用于记录中断嵌套的计数器OSIntNesting自增1; 其函数源代码如下: void OSIntEnter (void) { if (OSRunning == OS_TRUE) { if (OSIntNesting 255u) { OSIntNesting++; } } } 这里我想提醒大家的是:uC/OS-II的程序设计思想是非常严谨的,OSIntEnter首先判断中断发生是否在uC/OS-II整个系统启动后,如果不是这样的话,那么所有的uC/OS-II的系统功能均不能提供给用户使用。 void OSIntExit(void)函数时用于在用户编写的中断服务代码执行完毕以后,调用该函数,从而实现uC/OS-II始终保证“处于就绪状态下优先级最高的任务始终能得到系统的所有资源。 void OSIntExit(void)函数源代码如下: void OSIntExit (void) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr = 0; #endif if (OSRunning == OS_TRUE) { OS_ENTER_CRITICAL(); if (OSIntNesting 0) { OSIntNesting--; } if (OSIntNesting == 0) { if (OSLockNesting == 0) { OS_SchedNew(); if (OSPrioHighRdy != OSPrioCur) { OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; #if OS_TASK_PROFILE_EN 0 OSTCBHighRdy-OSTCBCtxSwCtr++; #endif OSCtxSwCtr++; OSIntCtxSw(); } } } OS_EXIT_CRITICAL(); } } 这部分代码的意思,大家自己想一下了,这里我主要讲解一下在OS_CPU_A.a文件中的OSIntCtxSw()函数了。 大家记住一点:在OSIntExit()函数调用时,我们已经将当前任务的所用到的PC ,LR,R0-R12,CPSR压入到被中断了的任务堆栈中了,所以在这里就不再需要重复压栈的操作了。 详细代码如下: OSIntCtxSw LDR R0, =OSTaskSwHook MOV LR, PC BX R0 LDR R0, =OSPrioCur LDR R1, =OSPrioHighRdy LDRB R2, [R1] STRB R2, [R0] LDR R0, =OSTCBCur LDR R1, =OSTCBHighRdy LDR R2, [R1] STR R2, [R0] LDR SP, [R2] LDMFD SP!, {R0} MSR SPSR_cxsf, R0 LDMFD SP!, {R0-R12, LR, PC}^

文档评论(0)

af60068 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档