00001 /************************************************** 00002 * Tasking kernel file 00003 * 00004 * File: os_core.c 00005 * Author: Book Chen 00006 * 2008.08.08 00007 **************************************************** 00008 */ 00009 #include "..\inc\includes.h" 00010 #include "..\os_core\os_includes.h" 00011 00012 INT8U data OSRunning=0; 00013 struct OS_CORE_CTRL OsCoreCtrl; 00014 void OsCorePowerOnInit(void) LargeReentrant; 00015 void OsCoreStart(void) LargeReentrant; 00016 void OsCoreScheduler(void) LargeReentrant; 00017 00018 void OsCorePowerOnInit() LargeReentrant{ 00019 OsCoreCtrl.Status=0; 00020 OsCoreCtrl.TaskSwitch=FALSE; 00021 OsCoreCtrl.TaskCswTimer=TASK_CSW_TIME; 00022 OSRunning=0; 00023 } 00024 void OsCoreStart() LargeReentrant{ 00025 if((OSRunning==0)&&(OsTaskCtrl.TaskNum!=0)){ 00026 OSRunning=1; // Set OS running flag 00027 OsTaskCtrl.CurTaskId=0; // Set first task for running 00028 OSPrioCur=OsTaskCtrl.CurTaskId; // get current task id 00029 OSTCBCur=(INT16U)&TaskTable[OsTaskCtrl.CurTaskId]; // Get OS_TCB struct address 00030 OS_ENTER_CRITICAL(); // Disable all interrupt 00031 OsCpuLoadContext(); // OS switch to first task 00032 OS_EXIT_CRITICAL(); // This line will not execute...just for code symmetry 00033 } 00034 } 00035 void OsCoreScheduler(void) LargeReentrant{ // task level scheduler 00036 if(OsTaskCtrl.TaskNum>=2){ // one task no need scheduler 00037 OsCoreCtrl.TaskCswTimer=TASK_CSW_TIME; // reset task switch timer 00038 if((OsTaskCtrl.CurTaskId+1)<OsTaskCtrl.TaskNum){ 00039 OsTaskCtrl.CurTaskId++; 00040 OSPrioHighRdy=OsTaskCtrl.CurTaskId; 00041 OSTCBHighRdy=(INT16U)&TaskTable[OsTaskCtrl.CurTaskId]; 00042 } 00043 else{ 00044 OsTaskCtrl.CurTaskId=0; 00045 OSPrioHighRdy=OsTaskCtrl.CurTaskId; 00046 OSTCBHighRdy=(INT16U)&TaskTable[OsTaskCtrl.CurTaskId]; 00047 } 00048 OsCoreCtrl.TaskSwitch=TRUE; // set task switch flag true 00049 } 00050 if(OsCoreCtrl.TaskSwitch==TRUE){ 00051 OsCoreCtrl.TaskSwitch=FALSE; 00052 OsCpuContextSwitch(); // task level context switch execution 00053 } 00054 } 00055 void OsCoreSchedulerIsr(void) LargeReentrant{ // interrupt level scheduler 00056 if(OsTaskCtrl.TaskNum>=2){ 00057 OsCoreCtrl.TaskCswTimer=TASK_CSW_TIME; 00058 if((OsTaskCtrl.CurTaskId+1)<OsTaskCtrl.TaskNum){ 00059 OsTaskCtrl.CurTaskId++; 00060 OSPrioHighRdy=OsTaskCtrl.CurTaskId; 00061 OSTCBHighRdy=(INT16U)&TaskTable[OsTaskCtrl.CurTaskId]; 00062 } 00063 else{ 00064 OsTaskCtrl.CurTaskId=0; 00065 OSPrioHighRdy=OsTaskCtrl.CurTaskId; 00066 OSTCBHighRdy=(INT16U)&TaskTable[OsTaskCtrl.CurTaskId]; 00067 } 00068 OsCoreCtrl.TaskSwitch=TRUE; // set task switch flag true 00069 } 00070 } 00071