?? 00000001.htm
字號:
<br /> <br /> y = OSUnMapTbl[OSRdyGrp]; /* Find highest priority's task priority number */ <br /> x = OSUnMapTbl[OSRdyTbl[y]]; <br /> prio = (y << 3) + x; <br /> OSTCBHighRdy = OSTCBPrioTbl[prio]; /* Point to highest priority task ready to run */ <br /> OSTCBCur = OSTCBHighRdy; <br /> OSRunning = TRUE; <br /> OSStartHighRdy(); /* Execute target specific code to start task */ <br />} <br /> <br /> <br />/* <br />********************************************************************************************************* <br />* uC/OS SCHEDULER <br />********************************************************************************************************* <br />*/ <br /> <br />void OSSched(void) <br />{ <br /> UBYTE y; <br /> <br /> <br /> OS_ENTER_CRITICAL(); <br /> if ((OSLockNesting | OSIntNesting) == 0) { /* Task scheduling must be enabled and not ISR level */ <br /> y = OSUnMapTbl[OSRdyGrp]; /* Get pointer to highest priority task ready to run */ <br /> OSTCBHighRdy = OSTCBPrioTbl[(y << 3) + OSUnMapTbl[OSRdyTbl[y]]]; <br /> if (OSTCBHighRdy != OSTCBCur) { /* Make sure this is not the current task running */ <br /> OSCtxSwCtr++; /* Increment context switch counter */ <br /> OS_TASK_SW(); /* Perform a context switch */ <br /> } <br /> } <br /> OS_EXIT_CRITICAL(); <br />} <br />/*$PAGE*/ <br />/* <br />********************************************************************************************************* <br />* PREVENT SCHEDULING <br />********************************************************************************************************* <br />*/ <br /> <br />void OSSchedLock(void) <br />{ <br /> if (OSRunning == TRUE) { /* Make sure multitasking is running */ <br /> OS_ENTER_CRITICAL(); <br /> OSLockNesting++; /* Increment lock nesting level */ <br /> OS_EXIT_CRITICAL(); <br /> } <br />} <br /> <br /> <br />/* <br />********************************************************************************************************* <br />* ENABLE SCHEDULING <br />********************************************************************************************************* <br />*/ <br /> <br />void OSSchedUnlock(void) <br />{ <br /> if (OSRunning == TRUE) { /* Make sure multitasking is running */ <br /> OS_ENTER_CRITICAL(); <br /> if (OSLockNesting != 0) { /* Do not decrement if already 0 */ <br /> OSLockNesting--; /* Decrement lock nesting level */ <br /> if ((OSLockNesting | OSIntNesting) == 0) { /* See if scheduling re-enabled and not an ISR */ <br /> OS_EXIT_CRITICAL(); <br /> OSSched(); /* See if a higher priority task is ready */ <br /> } else { <br /> OS_EXIT_CRITICAL(); <br /> } <br /> } else { <br /> OS_EXIT_CRITICAL(); <br /> } <br /> } <br />} <br />/*$PAGE*/ <br />/* <br />********************************************************************************************************* <br />* INITIALIZE TCB <br />********************************************************************************************************* <br />*/ <br /> <br />UBYTE OSTCBInit(UBYTE prio, void OS_FAR *stk) <br />{ <br /> OS_TCB *ptcb; <br /> <br /> <br /> OS_ENTER_CRITICAL(); <br /> ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list */ <br /> if (ptcb != (OS_TCB *)0) { <br /> OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */ <br /> OS_EXIT_CRITICAL(); <br /> ptcb->OSTCBStkPtr = stk; /* Load Stack pointer in TCB */ <br /> ptcb->OSTCBPrio = (UBYTE)prio; /* Load task priority into TCB */ <br /> ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */ <br /> ptcb->OSTCBDly = 0; <br /> ptcb->OSTCBDelReq = OS_NO_ERR; <br />
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -