- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ucosIII 中断 临界区与时间管理
ucosIII 中断period;临界区与时间管理
讲述了进入和退出中断的方法
临界区的介绍以及延时函数,取消延时函数和获取系统时间
ucosIII中断
中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。
void USART1_IRQHandler(void){ OSIntEnter(); //中断服务程序 OSIntExit();} 1
void OSIntEnter (void){ if (OSRunning != OS_STATE_OS_RUNNING) {//用于确定系统是否正常运行 return } if (OSIntNestingCtr = (OS_NESTING_CTR)250u) { return; } OSIntNestingCtr++;//中断嵌套的层数}1
OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()。
退出函数内部步骤如下:
1.系统是否运行。不符合则退出
2.关闭全局中断
3.中断嵌套次数和任务切换次数记录
4.进行中断级任务切换
void OSIntExit (void){ CPU_SR_ALLOC();//宏定义的CPU_SR if (OSRunning != OS_STATE_OS_RUNNING) { /* Has the OS started? */ return; /* No */ } /*关闭全局中断,包括关闭滴答定时器中断*/ CPU_INT_DIS(); if (OSIntNestingCtr == (OS_NESTING_CTR)0) { /* Prevent OSIntNestingCtr from wrapping */ CPU_INT_EN(); return; } OSIntNestingCtr--;//中断嵌套次数 if (OSIntNestingCtr (OS_NESTING_CTR)0) { /* ISRs still nested? */ CPU_INT_EN(); /* Yes */ return; } /*OSSchedLockNestingCtr 调度器是否加锁的标志*/ if (OSSchedLockNestingCtr (OS_NESTING_CTR)0) { /* Scheduler still locked? */ CPU_INT_EN(); /* Yes */ return; } /*获得最高优先级的任务*/ OSPrioHighRdy = OS_PrioGetHighest(); /* Find highest priority */ OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr; /* Get highest priority task ready-to-run */ if (OSTCBHighRdyPtr == OSTCBCurPtr) { /* Current task still the highest priority? */ CPU_INT_EN(); /* Yes */ return; }#if OS_CFG_TASK_PROFILE_EN 0u OSTCBHighRdyPtr-CtxSwCtr++; /* Inc. # of context switches for this new task */#endif OSTaskCtxSwCtr++; //任务切换的次数 /* Keep track of the total number of ctx switches */#if defined(OS_CFG_TLS_TBL_SIZE) (OS_CFG_TLS_TBL_SIZE 0u) OS_TLS_TaskSw();#endif /*中断级任务调度*/ OSIntCtxSw(); /* Perform interrupt level ctx switch */ CPU_INT_EN();}1
临界段代码也叫做临界区,是指那些必须完整连续运行,不可被打断的代码段。当访问这些临界段代码的时候需要对这些临界段代码进行保护
宏OS_CFG_ISR_POST_DEFERRED_EN:
0:UCOSIII使用关中断的方式来保护临界段代码
1:采用给调度器上锁的方式来保护临界段代码。
UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENT
原创力文档


文档评论(0)