ucos调度算法改造

上传人:第*** 文档编号:49290314 上传时间:2018-07-26 格式:PPTX 页数:30 大小:1.38MB
返回 下载 相关 举报
ucos调度算法改造_第1页
第1页 / 共30页
ucos调度算法改造_第2页
第2页 / 共30页
ucos调度算法改造_第3页
第3页 / 共30页
ucos调度算法改造_第4页
第4页 / 共30页
ucos调度算法改造_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《ucos调度算法改造》由会员分享,可在线阅读,更多相关《ucos调度算法改造(30页珍藏版)》请在金锄头文库上搜索。

1、LOGOuc/os的调度算法 总结1LOGOuC/OS-II的任务有两种:用户任务和系统任务。由应用程 序设计者编写的任务叫做用户任务,由系统提供的任务叫 做系统任务。用户任务是为解决应用问题而编写的,系统 任务是为应用程序来提供某种服务的。目前,uC/OS-II最多可以对64个任务(包括用户任务和系 统任务)进行管理。v调度算法:可抢占的高优先级调度算法 v调度条件:它在系统或用户任务调用系统函数及执行 中断服务程序结束时来调用调度器,以确定该运行的任 务并运行它。 v uC/OS-II进行任务调度的依据:任务就绪表。LOGOC/OS任务调度器实现及源代码分析void OSSched (vo

2、id)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增加时间片轮转开关O

3、S_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 pr

4、io) 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 =

5、 (OS_TCB *)0; #endif 当前每个优先级下的任务数为0初始化新加入的其他变量LOGOOSTaskCreatExt()进行以下判断 OSTCBPrioTbl4=(OS_TCB*)0 需修改代码,屏蔽该判断OS_TCBInit()OSTCBListOSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0 0OSTCBPrioTbl63OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40OSTCBPrioTbl4OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSch

6、ePrevprio=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

7、= 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-OSTim

8、eScheNext-OSTimeSchePrev = ptcb; OSTCBPrioTblprio-OSTimeScheNext = ptcb;OS_EXIT_CRITICAL();return (OS_ERR_NONE); #else#endifOS_TCBInit()当前优先级下的任务数+1赋值时间片大小处理优先级下只有一个任务的情况处理优先级下有多个任务的情况LOGOOSTCBListOSTimeSchePrevOSTCBNextOSTimeScheNextOSTCBPrev0OSTCBPrioTbl63OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSche

9、Prev0OSTCBPrioTbl4OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=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+) #endi

10、f 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

11、; #endif ptcb = ptcb-OSTCBNext; 、 OS_EXIT_CRITICAL(); OSTimeTick()节拍服务子程序 for循环依次遍历同优先级任务组.恢复时延到期且未被挂起的任务while循环依次遍历OSTCBListLOGOOSTCBListOSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0OSTCBPrioTbl63OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrev0OSTCBPrioTbl4OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSch

12、ePrevprio=40OSTCBNextOSTimeScheNextOSTCBPrevOSTimeSchePrevprio=40判断当前任务时间片是否用完, 以指向同优先级任务组的下一个prio=4OSTCBId=0OSTCBId=1OSTCBId=2OSTimeTick()LOGO#if OS_TASK_ROUNDROBIN_EN0uif (OSTCBPrioTblOSTCBCurOSTCBPrio-OSTimeSlice 0)/判断当前任务是否分配时间片 OS_Enter_CRITICAL(); OSTCBCur-OSTimeUsed+; /已使用时间片+1if (OSTCBCur-OS

13、TimeUsed = 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) OSTCBP

14、rioTblOSPrioCur = 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()退出中断函数

15、 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+;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号