00001 /******************** 00002 *Project: 80X86 32BIT MULTI TASKING OPERATING SYSTEM 00003 *Description: Scheduler of multi-tasking kernel 00004 * 00005 *Author: Book Chen 00006 *Date: 2010.01.01 00007 ********************* 00008 */ 00009 #include "includes.h" 00010 00011 OS_SCHEDULER_CONTROL OsSchedulerCtrl; 00012 00013 void OsSchedulerInit(void){ 00014 OsSchedulerCtrl.State=0; 00015 OsSchedulerCtrl.TaskSwitchTimer=OS_TASK_SWITCH_TIME; 00016 OsSchedulerCtrl.CurrentPriority=0; 00017 } 00018 00019 OS_BOOL OsSchedulerFindRootTask(void){ 00020 OS_TASKENTRY *pOsTask; 00021 00022 if((pOsTask=OsTaskReadyTaskGet(0))==(OS_TASKENTRY *)OS_NULL) return false; 00023 OsSchedulerCtrl.CurrentPriority=0; // root task is at 0 priority 00024 pOsTask->Status=OS_TASK_EXECUTION; 00025 OsTaskCurrent=(U32)pOsTask; 00026 return OS_TRUE; 00027 } 00028 /***************** 00029 *function:OsSchedulerNextTaskFind 00030 *description:find next task to run. 00031 *because it is only used in isr,i add "Isr" in tail. 00032 *do not use this function in wrong place. 00033 ******************/ 00034 void OsSchedulerNextTaskFind(void){ 00035 OS_TASKENTRY *pOsTask; 00036 U8 TempPriority,i; 00037 #if(OS_CRITICAL_METHOD==3) 00038 U32 CpuEflags; 00039 #endif 00040 00041 OsEnterCritical(); 00042 TempPriority=OsSchedulerCtrl.CurrentPriority; 00043 for(i=0;i<OS_TASK_PRIORITY_MAX;i++){ 00044 TempPriority++; 00045 if(TempPriority==OS_TASK_PRIORITY_MAX) TempPriority=0; 00046 if((pOsTask=OsTaskReadyTaskGet(TempPriority))!=(OS_TASKENTRY *)OS_NULL) break; 00047 } 00048 if(pOsTask==(OS_TASKENTRY *)OS_NULL){ 00049 OsExitCritical(); 00050 return; 00051 } 00052 OsSchedulerCtrl.CurrentPriority=TempPriority; 00053 OsSchedulerCtrl.TaskSwitchTimer=OS_TASK_SWITCH_TIME; 00054 pOsTask->Status=OS_TASK_EXECUTION; 00055 OsTaskNext=(U32)pOsTask; 00056 pOsTask=(OS_TASKENTRY *)OsTaskCurrent; 00057 if(pOsTask->Status==OS_TASK_EXECUTION){ 00058 OsTaskReadyTaskPut(pOsTask); 00059 } 00060 OsTaskSwitch=true; 00061 OsExitCritical(); 00062 } 00063 00064 00065
1.5.9