void OSTaskSchedule(void) { OSTCBCur = OSTCBNext; OSCtxSw(); OSTaskNext++; while(OSTCBTbl[OSTaskNext].OSTCBStkPtr == (OS_STK*)0) { OSTaskNext++; if(OSTaskNext >= OS_MAX_TASKS) { OSTaskNext = 0; } } OSTCBNext = &OSTCBTbl[OSTaskNext]; // TimeMS++; // OS_TCB TcbTmp; // uint32_t i; // uint8_t HighestPriority = LOWEST_PRIORITY; // OSTCBCur = OSTCBNext; // TcbTmp = *OSTCBCur; //OSTaskNext++; //for(i = 0; i < OS_MAX_TASKS; i++) { //if(OSTCBTbl[i].TaskState == TASK_STATE_PAUSING) { //HighestPriority = OSTCBTbl[i].Priority < HighestPriority ? OSTCBTbl[i].Priority : HighestPriority; //} // } // for(i = OSTaskNext; i < OS_MAX_TASKS; i++) { // if(OSTCBTbl[i].IsDaemon) { // if(OSTCBTbl[i].TaskState == TASK_STATE_PAUSING) { //} // } else if(OSTCBTbl[i].Priority == HighestPriority && HighestPriority != LOWEST_PRIORITY) { // break; //} // if(OSTaskNext > 1 && i == OS_MAX_TASKS - 1) { // i = 0; //} // No Task/Daemon left, just to run TaskIdle // if(i == OSTaskNext - 1) { // i = 0; // break; //} // } // OSTaskNext = i; // OSTCBNext = &OSTCBTbl[OSTaskNext]; // OSCtxSw(); }
DWORD WINAPI OSCtxSwW32( LPVOID lpParameter ) { OS_INIT_CRITICAL(); while(!OSTerminateCtxSwW32) { if( WAIT_OBJECT_0 == WaitForSingleObject(OSCtxSwW32Event,INFINITE) ) { OS_ENTER_CRITICAL(); OSCtxSw(); OS_EXIT_CRITICAL(); } } return 0; }