资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
LOGOuc/os的调度算法 总结1LOGOuC/OS-II的任务有两种:用户任务和系统任务。由应用程 序设计者编写的任务叫做用户任务,由系统提供的任务叫 做系统任务。用户任务是为解决应用问题而编写的,系统 任务是为应用程序来提供某种服务的。目前,uC/OS-II最多可以对64个任务(包括用户任务和系 统任务)进行管理。v调度算法:可抢占的高优先级调度算法 v调度条件:它在系统或用户任务调用系统函数及执行 中断服务程序结束时来调用调度器,以确定该运行的任 务并运行它。 v uC/OS-II进行任务调度的依据:任务就绪表。LOGOC/OS任务调度器实现及源代码分析void OSSched (void)INT8U y;OS_ENTER_CRITICAL();if (OSLockNesting | OSIntNesting) = 0) y = OSUnMapTblOSRdyGrp;OSPrioHighRdy = (INT8U)(y 0uINT8U OSTimeSlice;/记录任务分配的时间片大小 INT8U OSTimeUsed;/记录任务所用时间片/用于将同优先级下的各个任务串成循环链表struct os_tcb *OSTimeSchePrev;struct os_tcb *OSTimeScheNext;#endifStep 1 增设变设变 量 在os_cfg.h增加时间片轮转开关OS_TASK_ROUNDROBIN_EN; 在 ucos_ii.h修改结构体OS_TCB:增加四个变量#if OS_TASK_ROUNDROBIN_EN0uINT8U SamePrioTaskCountOS_LOWEST_PRIO+1u;#endif 在 ucos_ii.h中增加记录同优先级下任务数量的数组。LOGOOS_InitTCBList ()初始化函数 OS_TCBInit(,INT16U timeSlice) OSTimeTick() OSIntExit() OS_Sched()OSTaskCreateExt(,INT16U timeSlice) OSTaskDel(INT8U prio) OSTaskDelReq(INT8U prio, INT16 id) OSTaskSuspend(INT8U prio, INT16U id) OSTaskResume(INT8U prio, INT16U id)Step 2 函数修改LOGOOS_InitTCBList ()初始化函数 #if OS_TASK_ROUNDROBIN_EN0ufor (int i = 0; i 0u ptcb1-OSTimeUsed = 0; ptcb1-OSTimeSlice = 0; ptcb1-OSTimeScheNext = (OS_TCB *)0; ptcb1-OSTimeSchePrev = (OS_TCB *)0; #endif 当前每个优先级下的任务数为0初始化新加入的其他变量LOGOOSTaskCreatExt()进行以下判断 OSTCBPrioTbl4=(OS_TCB*)0 需修改代码,屏蔽该判断OS_TCBInit()OSTCBListOSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0 0OSTCBPrioTbl63OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40OSTCBPrioTbl4OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40LOGOOSTaskCreateExt()/if(OSTCBPrioTblprio=(OS_TCB*)0) /OSTCBPrioTblprio=(OS_TCB*)1确保可以加入同优先级的任务LOGO#if OS_TASK_ROUNDROBIN_EN0uOS_ENTER_CRITICAL();SamePrioTaskCountprio+;OS_EXIT_CRITICAL();ptcb-OSTimeSlice = TimeSlice;if (SamePrioTaskCountprio = 1) OS_ENTER_CRITICAL();ptcb-OSTimeScheNext = ptcb;ptcb-OSTimeSchePrev= ptcb;OS_EXIT_CRITICAL();return (OS_ERR_NONE); else OS_ENTER_CRITICAL(); ptcb-OSTCBNext =OSTCBPrioTblprio-OSTCBNext;ptcb-OSTCBPrev= OSTCBPrioTblprio-OSTCBPrev;ptcb-OSTimeScheNext = OSTCBPrioTblprio-OSTimeScheNext;ptcb-OSTimeSchePrev= OSTCBPrioTblprio;OSTCBPrioTblprio-OSTimeScheNext-OSTimeSchePrev = ptcb; OSTCBPrioTblprio-OSTimeScheNext = ptcb;OS_EXIT_CRITICAL();return (OS_ERR_NONE); #else#endifOS_TCBInit()当前优先级下的任务数+1赋值时间片大小处理优先级下只有一个任务的情况处理优先级下有多个任务的情况LOGOOSTCBListOSTimeSchePrevOSTCBNextOSTimeScheNextOSTCBPrev0OSTCBPrioTbl63OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0OSTCBPrioTbl4OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40OSTimeSchePre vOSTCBNextOSTimeScheNextOSTCBPrevprio=40沿着QTCBList链表,依次往后判 断OSTCBDly-后是否为0,以恢 复未被挂起且时延到期的任务OSTimeTick()LOGOwhile (ptcb-OSTCBPrio != OS_TASK_IDLE_PRIO) #if OS_TASK_ROUNDROBIN_EN0ufor(int i = 0; i OSTCBPrio; i+) #endif if (ptcb-OSTCBDly != 0u) ptcb-OSTCBDly-; if (ptcb-OSTCBDly = 0u) if (ptcb-OSTCBStat ptcb-OSTCBStatPend = OS_STAT_PEND_TO; else ptcb-OSTCBStatPend = OS_STAT_PEND_OK; if (ptcb-OSTCBStat /* No, Make ready */ OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; #if OS_TASK_ROUNDROBIN_EN0u ptcb = ptcb-OSTimeScheNext; #endif ptcb = ptcb-OSTCBNext; 、 OS_EXIT_CRITICAL(); OSTimeTick()节拍服务子程序 for循环依次遍历同优先级任务组.恢复时延到期且未被挂起的任务while循环依次遍历OSTCBListLOGOOSTCBListOSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0OSTCBPrioTbl63OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0OSTCBPrioTbl4OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40判断当前任务时间片是否用完, 以指向同优先级任务组的下一个prio=4OSTCBId=0OSTCBId=1OSTCBId=2OSTimeTick()LOGO#if OS_TASK_ROUNDROBIN_EN0uif (OSTCBPrioTblOSTCBCurOSTCBPrio-OSTimeSlice 0)/判断当前任务是否分配时间片 OS_Enter_CRITICAL(); OSTCBCur-OSTimeUsed+; /已使用时间片+1if (OSTCBCur-OSTimeUsed = OSTCBCur-OSTimeSlice) /判断任务时间片是否用完 OS_ENTER_CRITICAL();OSTCBCur-OSTimeUsed = 0; /已使用时间片清0OS_TCB* tempTCB = ptcb-OSTimeScheNext;/寻找该优先级任务组中第一个未被挂起的任务 for (int i = 0; i OSTCBPrio; i+)if (tempTCB-OSTCBStat tempTCB = tempTCB-OSTimeScheNext;if (OSTCBPrioTblOSTCBCur-OSTCBPrio != tempTCB) OSTCBPrioTblOSPrioCur = tempTCB; /将寻找到的任务tempTCB赋值给OSTCBPrioTblOSPrioCurif (ptcb-OSTCBNext != (OS_TCB*)0)ptcb-OSTCBNext-OSTCBPrev = tempTCB; /修改OSTCBList if (ptcb-OSTCBPrev != (OS_TCB*)0)ptcb-OSTCBPrev-OSTCBNext = tempTCB;else OSTCBList = tempTCB;OS_EXIT_CRITICAL(); OSTimeTick节拍服务子程序 LOGOOSIntExit()退出中断函数 OS_SchedNew(); OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;if (OSTCBHighRdy !=OSTCBCur) #if OS_TASK_PROFILE_EN 0uOSTCBHighRdy-OSTCBCtxSwCtr+; #endif OSCtxSwCtr+; OSIntCtxSw();OS_SchedNew(); OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;if (OSTCBHighRdy !=OSTCBCur) #if OS_TASK_PROFILE_EN 0uOSTCBHighRdy-OSTCBCtxSwCtr+; #endif OSCtxSwCtr+;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号