00001 /*********************************** 00002 * Operation System Kernel File 00003 * Function: handle ready task scheduling 00004 * calculate task weighted priority and run the task 00005 * 00006 * Scheduler is an important part of rtos. 00007 * For uptimize scheduler performance, scheduler is splited out from os_core.c 00008 * Scheduler runs round robin now. 00009 * 00010 * File: os_scheduler.c 00011 * Author: Book Chen 00012 * Date: 2008.07.18 00013 ************************************ 00014 */ 00015 #include "includes.h" 00016 00017 OS_TCB *SchedulerListHead; 00018 OS_TCB *SchedulerListTail; 00019 OS_SCHEDULER_CONTROL OsSchedulerCtrl; 00020 void OsSchedulerInit(void); 00021 //void OsSchedulerPut(OS_TCB *pTcb); 00022 //OS_TCB *OsSchedulerDelete(INT8U TaskId); 00023 void OsSchedulerRunNext(void); 00024 void OsSchedulerFindNextIsr(void); 00025 INT8U OsSchedulerStartHigh(void); 00026 00027 void OsSchedulerInit(void){ 00028 SchedulerListHead=(OS_TCB *)0; 00029 SchedulerListTail=(OS_TCB *)0; 00030 OsSchedulerCtrl.EntryNumber=0; 00031 OsSchedulerCtrl.State=0; 00032 OsSchedulerCtrl.TaskSwitchTimer=TASK_SWITCH_TIME; 00033 } 00034 void OsSchedulerPut(OS_TCB *pOsTcb){ 00035 00036 OsTaskReadyTaskPut(pOsTcb); 00037 } 00038 //OS_TCB *OsSchedulerDelete(INT8U TaskId){ 00039 //OS_TCB *pOsTcb; 00040 // return (OS_TCB *)0; 00041 //} 00042 INT8U OsSchedulerStartHigh(void){ 00043 OS_TCB *pOsTcb; 00044 00045 if((pOsTcb=OsTaskReadyTaskGet(0))==(OS_TCB *)0) return FALSE; 00046 OSPrioCur=(INT32U)pOsTcb->Id; 00047 OSTCBCur=(INT32U)pOsTcb; 00048 return TRUE; 00049 } 00050 void OsSchedulerRunNext(void){ // task level scheduler 00051 OS_TCB *pOsTcb; 00052 00053 if((pOsTcb=OsTaskReadyTaskGet(0))==(OS_TCB *)0) return; 00054 OsSchedulerCtrl.TaskSwitchTimer=TASK_SWITCH_TIME; 00055 OSPrioHighRdy=(INT32U)pOsTcb->Id; 00056 OSTCBHighRdy=(INT32U)pOsTcb; 00057 pOsTcb=(OS_TCB *)OSTCBCur; 00058 if(pOsTcb->Status==OS_TASK_READY){ 00059 OsTaskReadyTaskPut(pOsTcb); 00060 } 00061 OS_TASK_SW(); 00062 } 00063 void OsSchedulerFindNextIsr(void){ // interrupt level scheduler 00064 OS_TCB *pOsTcb; 00065 00066 if((pOsTcb=OsTaskReadyTaskGet(0))==(OS_TCB *)0) return; 00067 OsSchedulerCtrl.TaskSwitchTimer=TASK_SWITCH_TIME; 00068 OSPrioHighRdy=(INT32U)pOsTcb->Id; 00069 OSTCBHighRdy=(INT32U)pOsTcb; 00070 pOsTcb=(OS_TCB *)OSTCBCur; 00071 if(pOsTcb->Status==OS_TASK_READY){ 00072 OsTaskReadyTaskPut(pOsTcb); 00073 } 00074 OSTaskSwitch=1; 00075 } 00076 00077 00078 00079 00080 00081 00082