?? 00000001.htm
字號:
ptcb->OSTCBY = prio >> 3; <br /> ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY]; <br /> ptcb->OSTCBX = prio & 0x07; <br /> ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX]; <br /> ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */ <br /> ptcb->OSTCBMsg = (void *)0; /* No message received */ <br /> OS_ENTER_CRITICAL(); <br /> OSTCBPrioTbl[prio] = ptcb; <br /> ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */ <br /> ptcb->OSTCBPrev = (OS_TCB *)0; <br /> if (OSTCBList != (OS_TCB *)0) { <br /> OSTCBList->OSTCBPrev = ptcb; <br /> } <br /> OSTCBList = ptcb; <br /> OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */ <br /> OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; <br /> OS_EXIT_CRITICAL(); <br /> return (OS_NO_ERR); <br /> } else { <br /> OS_EXIT_CRITICAL(); <br /> return (OS_NO_MORE_TCB); <br /> } <br />} <br />/*$PAGE*/ <br />/* <br />********************************************************************************************************* <br />* ENTER ISR <br />********************************************************************************************************* <br />*/ <br /> <br />void OSIntEnter(void) <br />{ <br /> OS_ENTER_CRITICAL(); <br /> OSIntNesting++; /* Increment ISR nesting level */ <br /> OS_EXIT_CRITICAL(); <br />} <br /> <br /> <br />/* <br />********************************************************************************************************* <br />* EXIT ISR <br />********************************************************************************************************* <br />*/ <br /> <br />void OSIntExit(void) <br />{ <br /> OS_ENTER_CRITICAL(); <br /> if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */ <br /> OSIntExitY = OSUnMapTbl[OSRdyGrp]; <br /> OSTCBHighRdy = OSTCBPrioTbl[(OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]]; <br /> if (OSTCBHighRdy != OSTCBCur) { /* No context switch if current task is highest ready */ <br /> OSCtxSwCtr++; <br /> OSIntCtxSw(); /* Perform interrupt level context switch */ <br /> } <br /> } <br /> OS_EXIT_CRITICAL(); <br />} <br />/*$PAGE*/ <br />#if OS_TASK_CHANGE_PRIO_EN <br />/* <br />********************************************************************************************************* <br />* CHANGE PRIORITY OF A TASK <br />********************************************************************************************************* <br />*/ <br /> <br />UBYTE OSTaskChangePrio(UBYTE oldprio, UBYTE newprio) <br />{ <br /> OS_TCB *ptcb; <br /> OS_EVENT *pevent; <br /> UBYTE x; <br /> UBYTE y; <br /> UBYTE bitx; <br /> UBYTE bity; <br /> <br /> <br /> <br /> if (oldprio >= OS_MAX_TASKS || newprio >= OS_MAX_TASKS) { <br /> return (OS_PRIO_INVALID); <br /> } <br /> OS_ENTER_CRITICAL(); <br /> if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */ <br /> OS_EXIT_CRITICAL(); <br /> return (OS_PRIO_EXIST); <br /> } else { <br /> OS_EXIT_CRITICAL(); <br /> y = newprio >> 3; /* Precompute to reduce INT. latency */ <br /> bity = OSMapTbl[y]; <br /> x = newprio & 0x07; <br /> bitx = OSMapTbl[x]; <br /> OS_ENTER_CRITICAL(); <br /> if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) { /* Task to change must exist */ <br /> OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */ <br /> if (OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) { /* If task is ready make it not ready */ <br /> if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { <br /> OSRdyGrp &= ~ptcb->OSTCBBitY; <br /> } <br />
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -