00001 ;
00002
00003
00004
00005
00006
00007
00008
00009
00010 NAME OS_CPU_A51
00011 $include(8052sfr.inc)
00012 public OsCpuStack ; 8051 stack base
00013 public OSPrioCur ; Current running task id
00014 PUBLIC OSPrioHighRdy ; Next ready task id
00015 public OSTCBCur ; Current running task
00016 public OSTCBHighRdy ; Next task ready to run
00017 public OsCpuLoadContext ; Function for load 1st task to run
00018 public OsCpuContextSwitch ; Function for task level context switch
00019 public OsCpuContextSwitchIsr ; Function for interrupt level context switch
00020
00021 PUSHA MACRO
00022 IRP REG, <ACC, B, DPH, DPL, PSW, R0, R1, R2, R3, R4, R5, R6, R7>
00023 MOV A, REG
00024 PUSH ACC
00025 ENDM
00026 ENDM
00027 POPA MACRO
00028 IRP REG, <R7, R6, R5, R4, R3, R2, R1, R0, PSW, DPL, DPH, B, ACC>
00029 POP ACC
00030 MOV REG, A
00031 ENDM
00032 ENDM
00033
00034 DT?OsCpuStackPointer SEGMENT DATA
00035 RSEG DT?OsCpuStackPointer
00036 OsCpuStackPointer: DS 2
00037 OsCpuStackPointer2: DS 2
00038 OSTCBCur: DS 2
00039 OSTCBHighRdy: DS 2
00040 OSPrioCur: DS 1
00041 OSPrioHighRdy: DS 1
00042
00043 ?STACK SEGMENT IDATA ; STACK is declare as "DS 1" at startup.a51
00044 RSEG ?STACK ;
00045 OsCpuStack: ; OsCpuStack is STACK+1
00046
00047 ?PR?MemberFunc?OS_CPU_A51 SEGMENT CODE
00048 RSEG ?PR?MemberFunc?OS_CPU_A51
00049 OsCpuLoadContext:
00050 ;
00051 mov dph,OSTCBCur ; get task control block struct address of current task
00052 mov dpl,OSTCBCur+1 ; get task control block struct address of current task
00053 inc dptr ; Skip 1st byte of OsCpuTaskStack...1st byte is pointer type byte
00054 movx a,@dptr ; get task memory stack pointer in OS_TCB
00055 mov OsCpuStackPointer,a ; get task memory stack pointer in OS_TCB
00056 inc dptr ;
00057 movx a,@dptr ; get task memory stack pointer in OS_TCB
00058 mov OsCpuStackPointer+1,a ; get task memory stack pointer in OS_TCB
00059
00060 mov dph,OsCpuStackPointer ;
00061 mov dpl,OsCpuStackPointer+1 ;
00062 movx a,@dptr ; get 1st byte in task memory stack
00063 mov sp,a ; assign to 8051 sp sfr
00064 mov r0,sp ;
00065 inc dptr ; index to next byte of task memory stack
00066 L_LoadLoop: ; Load context loop
00067 movx a,@dptr ; Load context loop
00068 mov @r0,a ; Load context loop
00069 inc dptr ; Load context loop
00070 dec r0 ; Load context loop
00071 cjne r0,#OsCpuStack-1,L_LoadLoop ; Load context loop
00072
00073 mov OsCpuStackPointer,dph ; Store back task stack pointer address value
00074 mov OsCpuStackPointer+1,dpl ; Store back task stack pointer address value
00075
00076 mov dph,OSTCBCur ; get task control block struct address of current task
00077 mov dpl,OSTCBCur+1 ; get task control block struct address of current task
00078 inc dptr
00079 mov a,OsCpuStackPointer ; save task stack pointer back to task control block struct
00080 movx @dptr,a ; save task stack pointer back to task control block struct
00081 inc dptr
00082 mov a,OsCpuStackPointer+1 ; save task stack pointer back to task control block struct
00083 movx @dptr,a ; save task stack pointer back to task control block struct
00084
00085 POPA ; Take out r0~r7,psw,dpl,dph,b,acc
00086 setb ea ; Enable all interrupt
00087 ret ; return to Task which is pre_store in task stack
00088
00089 OsCpuContextSwitch:
00090 L_OsCpuContextSave: ; Task level context switch
00091 PUSHA ; Push acc,b,dph,dpl,psw,r0~r7
00092 mov dph,OSTCBCur ; Get task control block struct address of current task
00093 mov dpl,OSTCBCur+1 ; Get task control block struct address of current task
00094 inc dptr ; Skip 1st byte of OsCpuTaskStack...1st byte is pointer type byte
00095 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00096 mov OsCpuStackPointer,a ; Get task memory stack pointer in OS_TCB
00097 inc dptr
00098 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00099 mov OsCpuStackPointer+1,a ; Get task memory stack pointer in OS_TCB
00100
00101 clr c
00102 mov a,sp ; Get 8051 stack top
00103 subb a,#OsCpuStack-1 ; Get 8051 stack depth
00104 mov r0,a ; Store 8051 stack depth in r0
00105 inc a ; A stack space for storing "stack depth"
00106 mov dph,OsCpuStackPointer
00107 mov dpl,OsCpuStackPointer+1
00108 clr c
00109 xch a,dpl
00110 subb a,dpl
00111 jnc L_ContextSave
00112 dec dph
00113 L_ContextSave:
00114 mov dpl,a
00115 mov OsCpuStackPointer,dph ;
00116 mov OsCpuStackPointer+1,dpl ;
00117 mov a,sp ; Save 8051 sp top to task memory stack
00118 movx @dptr,a ; Save 8051 sp top to task memory stack
00119 L_ContextSaveLoop: ; Loop for copying 8051 stack to task memory stack
00120 inc dptr ; Loop for copying 8051 stack to task memory stack
00121 pop acc ; Loop for copying 8051 stack to task memory stack
00122 movx @dptr,a ; Loop for copying 8051 stack to task memory stack
00123 djnz r0,L_ContextSaveLoop ; Loop for copying 8051 stack to task memory stack
00124 mov dph,OSTCBCur ;
00125 mov dpl,OSTCBCur+1 ;
00126 inc dptr ;
00127 mov a,OsCpuStackPointer ; Save task stack pointer back to task control block struct
00128 movx @dptr,a ; Save task stack pointer back to task control block struct
00129 inc dptr
00130 mov a,OsCpuStackPointer+1 ; Save task stack pointer back to task control block struct
00131 movx @dptr,a ; Save task stack pointer back to task control block struct
00132
00133 L_OsCpuContextLoad:
00134 mov dph,OSTCBHighRdy ; Get task control block struct address of next task
00135 mov dpl,OSTCBHighRdy+1 ; Get task control block struct address of next task
00136 inc dptr
00137 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00138 mov OsCpuStackPointer2,a ; Get task memory stack pointer in OS_TCB
00139 inc dptr
00140 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00141 mov OsCpuStackPointer2+1,a ; Get task memory stack pointer in OS_TCB
00142
00143 mov dph,OsCpuStackPointer2
00144 mov dpl,OsCpuStackPointer2+1
00145 movx a,@dptr ; Get 8051 stack top from task memory stack
00146 mov sp,a ; Get 8051 stack top from task memory stack
00147 mov r0,sp
00148 inc dptr
00149 L_OsCpuContextLoadLoop: ; Loop for copying task memory stack to 8051 stack
00150 movx a,@dptr ; Loop for copying task memory stack to 8051 stack
00151 mov @r0,a ; Loop for copying task memory stack to 8051 stack
00152 inc dptr ; Loop for copying task memory stack to 8051 stack
00153 dec r0 ; Loop for copying task memory stack to 8051 stack
00154 cjne r0,#OsCpuStack-1,L_OsCpuContextLoadLoop ; Loop for copying task memory stack to 8051 stack
00155 mov OsCpuStackPointer2,dph ; re_store next task stack pointer
00156 mov OsCpuStackPointer2+1,dpl ; re_store next task stack pointer
00157
00158 mov dph,OSTCBHighRdy
00159 mov dpl,OSTCBHighRdy+1
00160 inc dptr
00161 mov a,OsCpuStackPointer2 ; save task stack pointer back to task control block struct
00162 movx @dptr,a ; save task stack pointer back to task control block struct
00163 inc dptr
00164 mov a,OsCpuStackPointer2+1 ; save task stack pointer back to task control block struct
00165 movx @dptr,a ; save task stack pointer back to task control block struct
00166
00167 mov OSTCBCur,OSTCBHighRdy ; update OSTCBHighRdy to OSTCBCur
00168 mov OSTCBCur+1,OSTCBHighRdy+1 ; update OSTCBHighRdy to OSTCBCur
00169 mov OSPrioCur,OSPrioHighRdy ; update OSPrioHighRdy to OSPrioCur
00170
00171 POPA ; pop out next task stack
00172 setb ea ; enable interrupt
00173 ret ; return to next task
00174
00175 OsCpuContextSwitchIsr:
00176 L_SavetoTaskStackIsr:
00177 pop acc ; Pop out isr call out address...8051stack=task call out address+PUSHA
00178 pop acc ; Pop out isr call out address...8051stack=task call out address+PUSHA
00179 ; get current running task TCB stack pointer first
00180 mov dph,OSTCBCur ; Get task control block struct address of current task
00181 mov dpl,OSTCBCur+1 ; Get task control block struct address of current task
00182 inc dptr ; Skip 1st byte of OsCpuTaskStack...1st byte is pointer type byte
00183 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00184 mov OsCpuStackPointer,a ; Get task memory stack pointer in OS_TCB
00185 inc dptr
00186 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00187 mov OsCpuStackPointer+1,a ; Get task memory stack pointer in OS_TCB
00188
00189 clr c
00190 mov a,sp ; Get 8051 stack top
00191 subb a,#OsCpuStack-1 ; Get 8051 stack depth
00192 mov r0,a ; Store 8051 stack depth in r0
00193 inc a ; A stack space for storing "stack depth"
00194 mov dph,OsCpuStackPointer
00195 mov dpl,OsCpuStackPointer+1
00196 clr c
00197 xch a,dpl
00198 subb a,dpl
00199 jnc L_ContextSaveIsr
00200 dec dph
00201 L_ContextSaveIsr:
00202 mov dpl,a
00203 mov OsCpuStackPointer,dph ;
00204 mov OsCpuStackPointer+1,dpl ;
00205 mov a,sp ; Save 8051 sp top to task memory stack
00206 movx @dptr,a ; Save 8051 sp top to task memory stack
00207 L_ContextSaveLoopIsr:
00208 inc dptr ; Loop for copying 8051 stack to task memory stack
00209 pop acc ; Loop for copying 8051 stack to task memory stack
00210 movx @dptr,a ; Loop for copying 8051 stack to task memory stack
00211 djnz r0,L_ContextSaveLoopIsr ; Loop for copying 8051 stack to task memory stack
00212 mov dph,OSTCBCur ;
00213 mov dpl,OSTCBCur+1 ;
00214 inc dptr ;
00215 mov a,OsCpuStackPointer ; Save task stack pointer back to task control block struct
00216 movx @dptr,a ; Save task stack pointer back to task control block struct
00217 inc dptr
00218 mov a,OsCpuStackPointer+1 ; Save task stack pointer back to task control block struct
00219 movx @dptr,a ; Save task stack pointer back to task control block struct
00220
00221 L_OsCpuLoadTo8051Isr: ; Load task stack to 8051 stack
00222 mov dph,OSTCBHighRdy ; Get task control block struct address of next task
00223 mov dpl,OSTCBHighRdy+1 ; Get task control block struct address of next task
00224 inc dptr
00225 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00226 mov OsCpuStackPointer2,a ; Get task memory stack pointer in OS_TCB
00227 inc dptr
00228 movx a,@dptr ; Get task memory stack pointer in OS_TCB
00229 mov OsCpuStackPointer2+1,a ; Get task memory stack pointer in OS_TCB
00230
00231 mov dph,OsCpuStackPointer2
00232 mov dpl,OsCpuStackPointer2+1
00233 movx a,@dptr ; Get 8051 stack top from task memory stack
00234 mov sp,a ; Get 8051 stack top from task memory stack
00235 mov r0,sp
00236 inc dptr
00237 L_OsCpuContextLoadLoopIsr: ; Loop for copying task memory stack to 8051 stack
00238 movx a,@dptr ; Loop for copying task memory stack to 8051 stack
00239 mov @r0,a ; Loop for copying task memory stack to 8051 stack
00240 inc dptr ; Loop for copying task memory stack to 8051 stack
00241 dec r0 ; Loop for copying task memory stack to 8051 stack
00242 cjne r0,#OsCpuStack-1,L_OsCpuContextLoadLoopIsr ; Loop for copying task memory stack to 8051 stack
00243 mov OsCpuStackPointer2,dph ; save dptr to next task stack pointer
00244 mov OsCpuStackPointer2+1,dpl ; save dptr to next task stack pointer
00245
00246 mov dph,OSTCBHighRdy
00247 mov dpl,OSTCBHighRdy+1
00248 inc dptr
00249 mov a,OsCpuStackPointer2 ; save task stack pointer back to task control block struct
00250 movx @dptr,a ; save task stack pointer back to task control block struct
00251 inc dptr
00252 mov a,OsCpuStackPointer2+1 ; save task stack pointer back to task control block struct
00253 movx @dptr,a ; save task stack pointer back to task control block struct
00254
00255 mov OSTCBCur,OSTCBHighRdy ; update OSTCBHighRdy to OSTCBCur
00256 mov OSTCBCur+1,OSTCBHighRdy+1 ; update OSTCBHighRdy to OSTCBCur
00257 mov OSPrioCur,OSPrioHighRdy ; update OSPrioHighRdy to OSPrioCur
00258
00259 POPA ; pop out next task stack
00260 setb ea ; enable interrupt
00261 reti ; return from interrupt
00262 end