Task Structure 》 void YourTask (void *pdata) (1) for(;;){ (2) /*用户代码*/ 调用uC/OS-II的某种系统服务(将自己挂起): OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS PRTO SEIF); OSTaskSuspend (OS PRIO SELF); OSTimeDly(); OSTimeDlyHMSM () /*用户代码*/ } }
llxx@ustc.edu.cn 16/90 Task Structure void YourTask (void *pdata) (1) { for (;;) { (2) /* 用户代码 */ 调用uC/OS-II的某种系统服务(将自己挂起): OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用户代码 */ } } UnRegistered
范例1(编程模型) void main(void) PC_DispCIrScr(DISP_FGND_WHITE+DISP_BGIND_BLACK) //Clear the screen 1) OSInit(); /Initialize UC/OS-II (2) PC_DOSSaveReturn(;/Save environment to return to DO (3) PC VectSet(uCOS,OSCtxSw); (4) RandomSem =OSSemCreate(1); (5) OSTaskCreate(TaskStart,(void *)0,(void * &TaskStartStk[TASK STK SIZE-1],0); (6) OSStart(); (7) task是任务代码的指针(名),pdata是当任务开始执行时传递给任务的参数的指 针, ptos是分配给任务的堆栈的栈顶指钠x@pso是分配给任务的优先级。 17/90
llxx@ustc.edu.cn 17/90 范例1(编程模型) void main(void) { PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); //Clear the screen (1) OSInit(); // Initialize uC/OS-II (2) PC_DOSSaveReturn(); // Save environment to return to DOS (3) PC_VectSet(uCOS, OSCtxSw); (4) RandomSem = OSSemCreate(1); (5) OSTaskCreate(TaskStart, (void *)0, (void *) &TaskStartStk[TASK_STK_SIZE-1], 0); (6) OSStart(); (7) } task是任务代码的指针(名),pdata是当任务开始执行时传递给任务的参数的指 针, ptos是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级。 UnRegistered
void TaskStart(void *data) USTC { Prevent compiler warning by assigning 'data'to itself; Display banner identifying this as EXAMPLE #1; (1) OS ENTER CRITICALO); PC VectSet(0x08,OSTickISR); (2) PC SetTickRate(200); (3) OS EXIT CRITICAL(); OSStatInit(); //Initialize the statistic task (4) TaskStartCreateTasts();//Create 10 identical tasks (5) for (;; TaskStartDisp();//Display the number of tasks created If (key was pressed){ if (key pressed was the ESCAPE key){ PC DOSReturn(;} Delay for1 Second;Il挂起自己1s,允许执行OSStart(0 llxx@ustc.edu.cn 18/90
llxx@ustc.edu.cn 18/90 void TaskStart (void *data) { Prevent compiler warning by assigning ‘data’ to itself; Display banner identifying this as EXAMPLE #1; (1) OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); (2) PC_SetTickRate(200); (3) OS_EXIT_CRITICAL(); OSStatInit(); //Initialize the statistic task (4) TaskStartCreateTasts(); //Create 10 identical tasks (5) for (;;) { TaskStartDisp(); //Display the number of tasks created If (key was pressed) { if (key pressed was the ESCAPE key) { PC_DOSReturn();} } Delay for 1 Second; //挂起自己1s,允许执行OSStart() } } UnRegistered
2.5任务切换时机 。 系统启动时:OSStart(0 -OSStartHighRdy0:执行一次 WAITING 。 被抢占: -ISR结束OSIntExit() -中断嵌套全部退出后 ORMAN READY RUNNING ISR 。1 任务执行过程中:OS Sched0 一任务间通信:阻塞/同步 ·xxxPost(O/xxxPend()等函数调用 -时延:OSTimeDly0等计数事件使任务就绪 -执行完成,主动让出CPU(?) 一任务被删除时 llxx@ustc.edu.cn 19/90
llxx@ustc.edu.cn 19/90 2.5 任务切换时机 • 系统启动时:OSStart() – OSStartHighRdy():执行一次 • 被抢占: – ISR结束OSIntExit() –中断嵌套全部退出后 • 任务执行过程中:OS_Sched() – 任务间通信:阻塞/同步 • xxxPost()/xxxPend()等函数调用 – 时延:OSTimeDly()等计数事件使任务就绪 – 执行完成,主动让出CPU(?) – 任务被删除时 UnRegistered
任务调度器-OSSched ·任务调度步骤 一查找准备就绪的最高优先级的任务 ·高优先级=优先级号小 -进行上下文切换。 ·μC/0S任务调度基于就绪表,所花的时间为常 数,与应用程序中建立的任务数无关。 采用查找表法 llxx@ustc.edu.cn 20/90
llxx@ustc.edu.cn 20/90 任务调度器--OSSched • 任务调度步骤 –查找准备就绪的最高优先级的任务 • 高优先级=优先级号小 –进行上下文切换。 • mC/OS任务调度基于就绪表,所花的时间为常 数,与应用程序中建立的任务数无关。 –采用查找表法UnRegistered