如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
WhatisuC/OS?TheStoryofuC/OS概要任务task任务的数据结构—任务控制块任务控制块结构任务的状态任务的状态OSTCBStat大家学习辛苦了,还是要坚持任务的调度--OSSched任务的调度就绪状态标志根据优先级找到任务在就绪任务表中的位置根据优先级确定就绪表根据优先级确定就绪表根据优先级确定就绪表根据就绪表确定最高优先级(1)根据就绪表确定最高优先级(2)源代码中使用了查表法INT8UconstOSUnMapTbl[]={0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0};任务间通信手段事件控制块ECB信号量semaphore中断与时钟节拍多任务的启动任务的格式揭开神秘的面纱—任务调度全程追踪OSStartHighRdy:blOSTaskSwHook用户自定义函数把OSRunning设为1lir0,1lisr11,OSRunning@hastbr0,OSRunning@l(r11)获取准备运行的任务TCB指针lisr11,OSTCBHighRdy@halwzr11,OSTCBHighRdy@l(r11)设置当前运行任务TCBlisr12,OSTCBCur@hastwr11,OSTCBCur@l(r12)获取新的任务的堆栈指针lwzr1,0(r11)恢复新任务的上下文lwzr2,XR2(r1).......rfivoidOSTimeDly(INT16Uticks){if(ticks>0){确保tick大于0OS_ENTER_CRITICAL();进入临界段代码if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){/*Delaycurrenttask*/OSRdyGrp&=~OSTCBCur->OSTCBBitY;设置任务为非就绪状态}OSTCBCur->OSTCBDly=ticks;在TCB中装载延时数OS_EXIT_CRITICAL();退出临界段代码OSSched();调度下一个任务开始运行}}voidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();if((OSLockNesting|OSIntNesting)==0){调度锁,或者处于中断状态禁止调度y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);获取准备就绪组里最高优先级的任务if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];设置运行任务为最高优先级任务OSCtxSwCtr++;OS_TASK_SW();执行上下文切换}}OS_EXIT_CRITICAL();}OS_TASK_SW任务的上下文切换什么也不做的空闲任务voidOSTimeTick(void){OS_TCB*ptcb;ptcb=OSTCBList;---OSTCB链表指针while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){看是不是空闲任务,空闲任务是最后的任务if(ptcb->OSTCBDly!=0){是否延时if(--ptcb->OSTCBDly==0){延时减一,看是否延时结束if(!(ptcb->OSTCBStat&OS_S