00001 /*********************************** 00002 * Operation System Kernel File 00003 * Function: Os core function 00004 * 00005 * 00006 * File: os_core.c 00007 * Author: Book Chen 00008 * Date: 2008.07.18 00009 ************************************ 00010 */ 00011 #include "includes.h" 00012 00013 INT32U OSTaskSwitch; 00014 INT32U OSTCBCur; 00015 INT32U OSTCBHighRdy; 00016 INT32U OSPrioCur; 00017 INT32U OSPrioHighRdy; 00018 INT32U OSTaskSwHook; 00019 INT32U OSIntNesting; 00020 INT32U OSRunning; 00021 00022 void OsInit(void); 00023 void OsStart(void); 00024 void OsYield(void); 00025 void OsSleep(void); 00026 void OsFinish(void); 00027 void OsCoreInit(void); 00028 00029 void OsCoreInit(void){ 00030 OSIntNesting=0; 00031 OSTaskSwitch=0; 00032 OSRunning=0; 00033 } 00034 void OsInit(void){ 00035 OsCoreInit(); 00036 OsTaskInit(); 00037 OsSchedulerInit(); 00038 OsTimeInit(); 00039 OsEventInit(); 00040 OsSemaphoreInit(); 00041 OsFlagInit(); 00042 OsMboxInit(); 00043 OsMutexInit(); 00044 } 00045 void OsStart(void){ // Os gets first task to run 00046 if(OSRunning==FALSE){ 00047 if(OsSchedulerStartHigh()==TRUE){ 00048 OSStartHighRdy(); 00049 } 00050 } 00051 while(1); // If no task, halt os here. 00052 } 00053 void OsYield(void){ // Task switchs out 00054 OS_ENTER_CRITICAL(); 00055 OsSchedulerRunNext(); 00056 OS_EXIT_CRITICAL(); 00057 } 00058 void OsSleep(void){ // Task suspend 00059 OS_TCB *pOsTcb; 00060 00061 OS_ENTER_CRITICAL(); 00062 pOsTcb=(OS_TCB *)OSTCBCur; 00063 pOsTcb->Status=OS_TASK_SUSPEND; 00064 pOsTcb->PendingType=OS_PENDING_NONE; 00065 pOsTcb->TimeDelay=0; 00066 OsTaskSuspendTaskPut(pOsTcb); // put task into suspend list 00067 OsSchedulerRunNext(); 00068 OS_EXIT_CRITICAL(); 00069 } 00070 void OsFinish(void){ // Task killed 00071 OS_TCB *pOsTcb; 00072 00073 OS_ENTER_CRITICAL(); 00074 pOsTcb=(OS_TCB *)OSTCBCur; 00075 pOsTcb->Status=OS_TASK_FREE; 00076 pOsTcb->Id=0; 00077 pOsTcb->Priority=0; 00078 pOsTcb->Prev=(OS_TCB *)0; 00079 pOsTcb->Next=(OS_TCB *)0; 00080 OsTaskFreeTaskPut(pOsTcb); // put task tcb back to free list 00081 OsSchedulerRunNext(); 00082 OS_EXIT_CRITICAL(); 00083 } 00084