00001 /************************************************** 00002 * A small multi-tasking operation system using 8051 00003 * Supports task level context switch and interrupt 00004 * level context switch 00005 * 00006 * File: main.c 00007 * Author: Book Chen 00008 * 2008.08.08 00009 **************************************************** 00010 */ 00011 #include "..\inc\includes.h" 00012 #include "..\os_core\os_includes.h" 00013 #include "..\tasks\task_includes.h" 00014 00015 void F_SysPowerOnInit() LargeReentrant; 00016 00017 void main(void){ 00018 INT16U i; 00019 00020 for(i=0;i<=10000;i++); // delay for power stable 00021 // hardware and driver initial 00022 F_SysPowerOnInit(); // 8051 sfr initial 00023 F_TimePowerOnInit(); // set 8051 timer0,1,2 00024 F_UartPowerOnInit(); // set 8051 uart function 00025 F_IrdaPowerOnInit(); // set irda function 00026 // os initial 00027 OsCorePowerOnInit(); // os core initial 00028 OsTaskPowerOnInit(); // os task control initial 00029 // creat tasks 00030 OsTaskCreat(F_ShellTask); // creat F_ShellTask Task 00031 OsTaskCreat(F_LcmTask); // creat F_LcmTask Task 00032 OsTaskCreat(F_IrdaTask); // creat F_IrdaTask Task 00033 OsTaskCreat(F_MotorTask); // creat F_MotorTask Task 00034 OsTaskCreat(F_LedTask); // creat F_LedTask Task 00035 OsTaskCreat(F_RtcTask); // creat F_RtcTask Task 00036 // os starts to run 00037 OsCoreStart(); // switch 1st task 0 to run 00038 } 00039 void F_SysPowerOnInit(void) LargeReentrant{ 00040 P0=0xff; // 8051 initial all this sfrs as power on 00041 P2=0xff; // I prefer to initial them myself,again. 00042 //SP=0x00; 00043 //DPL=0x00; 00044 //DPH=0x00; 00045 PCON=0x00; 00046 TCON=0x00; 00047 T2CON=0x00; 00048 TMOD=0x00; 00049 TL0=0x00; 00050 TL1=0x00; 00051 TH0=0x00; 00052 TH1=0x00; 00053 //P1=0x00; 00054 SCON=0x00; 00055 //SBUF=0x00; 00056 //P2=0x00; 00057 IE=0x00; 00058 //P3=00 ; 00059 IP=0x00; 00060 //PSW=0x00; 00061 //ACC=0x00; 00062 //B=0x00; 00063 } 00064 //============= 00065 // isr routines...6 interrupt source 00066 // external int 0,1 00067 // timer 0,1,2 00068 // serial 00069 //============= 00070 void IsrExternalInt0(void) interrupt 0 00071 { 00072 // restart timer 0 for irda 00073 TR1=0; // Stop timer0 00074 ET1=0; // Disable timer0 interrupt 00075 IrdaCtrl.unTime.uc[0]=TH1; // Save timer0 00076 IrdaCtrl.unTime.uc[1]=TL1; // Save timer0 00077 TH1=0; // Initial timer0 00078 TL1=10; // Initial timer0...for time start from neg_edge 00079 TR1=1; // Restart timer0 00080 ET1=1; // Enable timer0 interrupt 00081 // handle irda signal 00082 if(IrdaCtrl.Status&cIrdaSignalDetect){ // Check if irda signal in coming 00083 F_IrdaGetSignalType(); // Translate time value to bit type 00084 IrdaCtrl.Status|=cIrdaSignalinput; // flag of irda has signal 00085 F_IrdaBitProc(); // Process ir bit signal 00086 } 00087 else IrdaCtrl.Status|=cIrdaSignalDetect; // Irda signal coming flag 00088 } 00089 void IsrTimer0(void) interrupt 1 00090 { 00091 TR0=0; // Stop timer0 00092 TH0=(65536-9216)/256; // 10ms=(12/11.0592M)*clock...clock=9216 00093 TL0=(65536-9216)%256; // 10ms=(12/11.0592M)*clock...clock=9216 00094 TR0=1; // Start timer0 00095 if(StepMotorCtrl.Timer!=0) StepMotorCtrl.Timer--; 00096 if(ShellTaskCtrl.TaskTimer!=0) ShellTaskCtrl.TaskTimer--; 00097 if(LedCtrl.Timer!=0) LedCtrl.Timer--; 00098 if(RtcCtrl.Timer!=0) RtcCtrl.Timer--; 00099 if(OsCoreCtrl.TaskCswTimer!=0) OsCoreCtrl.TaskCswTimer--; 00100 #if(ENABLE_INT_LEVEL_CSW==1) 00101 OS_ENTER_CRITICAL(); 00102 if(OsCoreCtrl.TaskCswTimer==0){ // time out for task switch 00103 OsCoreCtrl.TaskCswTimer=TASK_CSW_TIME; // setup next time out value 00104 OsCoreSchedulerIsr(); // find out next task ready to run 00105 if(OsCoreCtrl.TaskSwitch==TRUE){ // Task switch flag up 00106 OsCoreCtrl.TaskSwitch=FALSE; // clear task switch flag 00107 OsCpuContextSwitchIsr(); // execute interrupt level context switch 00108 } 00109 } 00110 OS_EXIT_CRITICAL(); // This line will never execute... 00111 // ...,because task is switched away and never come back here. 00112 #endif 00113 } 00114 void IsrExternalInt1(void) interrupt 2 // Not use,yet. 00115 { 00116 } 00117 void IsrTimer1(void) interrupt 3 00118 { 00119 TR1=0; // stop timer1 00120 ET1=0; // Disable timer1 interrupt 00121 IrdaCtrl.Status&=~cIrdaSignalDetect; // Ir signal is too long to be a signal 00122 } 00123 void IsrSerialint(void) interrupt 4 00124 { 00125 if(RI==1){ 00126 RI=0; // Clear uart rx interrupt flag 00127 F_UartKeyInPut(SBUF); // Put receive byte to uart rx buffer 00128 } 00129 if(TI==1){ 00130 TI=0; // Clear uart tx interrupt flag 00131 bUartTransfer=0; // Clear uart tx f/w flag 00132 } 00133 } 00134 void IsrTimer2(void) interrupt 5 // Not use,yet. 00135 { 00136 TF2=0; // TF2 is f/w clear 00137 } 00138 00139