📄 os_cpu_c.src
字号:
; PUSH(1); // should be R1
; SOURCE LINE # 103
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0027
DEC stk?044+01H
?C0027:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#01H
LCALL ?C?CSTPTR
; PUSH(2); // should be R2
; SOURCE LINE # 104
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0028
DEC stk?044+01H
?C0028:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#02H
LCALL ?C?CSTPTR
; PUSH(3); // should be R3
; SOURCE LINE # 105
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0029
DEC stk?044+01H
?C0029:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#03H
LCALL ?C?CSTPTR
;
; // stk += sizeof(void *); /* Keil C uses R1,R2,R3 to pass the */
; // *(void**)stk = vd; /* arguments of functions. */
;
; PUSH(4); /* R4 */
; SOURCE LINE # 110
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0030
DEC stk?044+01H
?C0030:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#04H
LCALL ?C?CSTPTR
; PUSH(5); /* R5 */
; SOURCE LINE # 111
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0031
DEC stk?044+01H
?C0031:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#05H
LCALL ?C?CSTPTR
; PUSH(6); /* R6 */
; SOURCE LINE # 112
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0032
DEC stk?044+01H
?C0032:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#06H
LCALL ?C?CSTPTR
; PUSH(7); /* R7 */
; SOURCE LINE # 113
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0033
DEC stk?044+01H
?C0033:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#07H
LCALL ?C?CSTPTR
;
; /* Following is the registers pushed into hardware stack manually to support the dallas 390 */
; PUSH(0x80); /* IE, EA is enabled */
; SOURCE LINE # 116
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0034
DEC stk?044+01H
?C0034:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#080H
LCALL ?C?CSTPTR
; /*
; Next is calculating the hardware stack pointer.
; */
; PUSH((INT8U) (STACK_START-2 /* Initial value when main was called */
; +1 /* IE */
; +8 /* R0-R7, eight registers was saved */
; +5 /* ACC, B, DPH, DPL, PSW, five registers */
; //+1 /* Dallas 390 extra registers DPX1 */
; // +4 /* Dallas 390 extra registers for second DPTR - DPL1 DPH1 DPX1 DPS */
; +sizeof(INT16U)) /* The PC value to be loaded */
; //+sizeof(INT8U) /* The third byte of PC value to be loaded for dallas 390 */
; );
; SOURCE LINE # 128
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0035
DEC stk?044+01H
?C0035:
DEC A
MOV R1,A
MOV R2,stk?044+01H
MOV A,#LOW (STACK_START+0EH)
LCALL ?C?CSTPTR
; PUSH(0); /* C_IBP *--CIBP */
; SOURCE LINE # 129
MOV R3,stk?044
MOV A,stk?044+02H
DEC stk?044+02H
JNZ ?C0036
DEC stk?044+01H
?C0036:
DEC A
MOV R1,A
MOV R2,stk?044+01H
CLR A
LCALL ?C?CSTPTR
; return ((void *)stk);
; SOURCE LINE # 130
MOV R6,stk?044+01H
MOV R7,stk?044+02H
; }
; SOURCE LINE # 131
?C0001:
RET
; END OF _OSTaskStkInit
;
; //OS_EXT OS_TCB *OSTCBHighRdy; /* Pointer to highest priority TCB ready to run */
; extern void LoadCtx() KCREENTRANT; /* Save the current working registers to stack, defined in OS_CPU_A.ASM */
;
; /*
; ***********************************************************************************************************
; * OSStartHighRdy: START MULTITASKING
; *
; * Duty: a) Call OSTaskSwHook() then,
; * b) Set OSRunning to TRUE,
; * c) Switch to the highest priority task.
; *
; ***********************************************************************************************************
; */
; void OSStartHighRdy(void) KCREENTRANT
RSEG ?PR?OSStartHighRdy?OS_CPU_C
OSStartHighRdy:
USING 0
; SOURCE LINE # 146
; {
; SOURCE LINE # 147
; OSTaskSwHook();
; SOURCE LINE # 148
LCALL OSTaskSwHook
; OSRunning=1;
; SOURCE LINE # 149
MOV OSRunning,#01H
;
; C_XBP = OSTCBHighRdy->OSTCBStkPtr;
; SOURCE LINE # 151
MOV R0,#LOW (OSTCBHighRdy)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV DPL,A
MOV DPH,R6
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV C_XBP,R6
MOV C_XBP+01H,A
;
; LoadCtx();
; SOURCE LINE # 153
LJMP LoadCtx
; END OF OSStartHighRdy
; }
;
; /**********************************************************************************************************
; * C_OSCtxSw is the c part of OSCtxSw.
; * When control passes to this function, the processor registers have been saved in external stack
; ***********************************************************************************************************/
; void C_OSCtxSw(void) KCREENTRANT
RSEG ?PR?C_OSCtxSw?OS_CPU_C
C_OSCtxSw:
USING 0
; SOURCE LINE # 160
; {
; SOURCE LINE # 161
; /* Save processor registers; DONE in the OSCtxSw part in OS_CPU_ASM.ASM */
;
; /* Save the current task's stack pointer into the current task's OS_TCB:
; OSTCBCur->OSTCBStkPtr = Stack pointer;
; Call user definable OSTaskSwHook();
; OSTCBCur = OSTCBHighRdy;
; OSPrioCur = OSPrioHighRdy;
; Get the stack pointer of the task to resume:
; Stack pointer = OSTCBHighRdy->OSTCBStkPtr;
; Restore all processor registers from the new task's stack;
; Execute a return from interrupt instruction; */
;
; OSTCBCur->OSTCBStkPtr = C_XBP;
; SOURCE LINE # 174
MOV R0,#LOW (OSTCBCur)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV DPL,A
MOV DPH,R6
MOV A,C_XBP
MOVX @DPTR,A
INC DPTR
MOV A,C_XBP+01H
MOVX @DPTR,A
;
; OSTaskSwHook();
; SOURCE LINE # 176
LCALL OSTaskSwHook
; OSTCBCur = OSTCBHighRdy;
; SOURCE LINE # 177
MOV R0,#LOW (OSTCBHighRdy)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
MOV R0,#LOW (OSTCBCur)
MOV @R0,AR6
INC R0
MOV @R0,AR7
; OSPrioCur = OSPrioHighRdy;
; SOURCE LINE # 178
MOV OSPrioCur,OSPrioHighRdy
;
; C_XBP = OSTCBCur->OSTCBStkPtr;
; SOURCE LINE # 180
DEC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV DPL,A
MOV DPH,R6
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV C_XBP,R6
MOV C_XBP+01H,A
; LoadCtx();
; SOURCE LINE # 181
LJMP LoadCtx
; END OF C_OSCtxSw
; }
;
; INT8U data SaveSP;
; INT8U * data SaveC_IBP;
;
; void OSIntCtxSw(void) KCREENTRANT
RSEG ?PR?OSIntCtxSw?OS_CPU_C
OSIntCtxSw:
USING 0
; SOURCE LINE # 187
; {
; SOURCE LINE # 188
; EA=0;
; SOURCE LINE # 189
CLR EA
; #pragma ASM
; // SP=SaveSP
; // C_IBP=SaveC_IBP;
; MOV SP,SaveSP
MOV SP,SaveSP
; MOV ?C_IBP,SaveC_IBP
MOV ?C_IBP,SaveC_IBP
; #pragma ENDASM
;
; C_XBP = OSTCBCur->OSTCBStkPtr;
; SOURCE LINE # 197
MOV R0,#LOW (OSTCBCur)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV DPL,A
MOV DPH,R6
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV C_XBP,R6
MOV C_XBP+01H,A
;
; #pragma ASM
; EXTRN CODE(_?KCOSCtxSw)
EXTRN CODE(_?KCOSCtxSw)
; //MOV A, #BYTE0( _?KCOSCtxSw)
; //PUSH ACC
; //MOV A, #BYTE1(_?KCOSCtxSw)
; //PUSH ACC
; MOV A, #LOW( _?KCOSCtxSw)
MOV A, #LOW( _?KCOSCtxSw)
; PUSH ACC
PUSH ACC
; MOV A, #HIGH(_?KCOSCtxSw)
MOV A, #HIGH(_?KCOSCtxSw)
; PUSH ACC
PUSH ACC
; //MOV A, #BYTE2(_?KCOSCtxSw)
; //PUSH ACC
; RETI
RETI
; #pragma ENDASM
; }
; SOURCE LINE # 213
RET
; END OF OSIntCtxSw
CSEG AT 0000BH
LJMP OSTickISR
;
; /* OSTickISR can be writen in c language now, so it is more easy for user to write code for their own */
; void OSTickISR(void) interrupt BSP_OS_TMR_SEL
RSEG ?PR?OSTickISR?OS_CPU_C
USING 0
OSTickISR:
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
XRL AUXR1,#01H
PUSH DPH
PUSH DPL
PUSH PSW
MOV PSW,#00H
PUSH AR0
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
USING 0
; SOURCE LINE # 216
; {
; TH0=(OS_Time_Count)>>8;
; SOURCE LINE # 218
MOV TH0,#0B8H
; TL0+=OS_Time_Count;
; SOURCE LINE # 219
; /* Do this first */
; OSIntNesting++; /* Increment ISR nesting level directly to speed up processing */
; SOURCE LINE # 221
INC OSIntNesting
; // OSIntEnter(); /* Must be called first at every hardware interrupt entry point */
; if(OSIntNesting==1) /* Only at the outerest interrupt we do these. */
; SOURCE LINE # 223
MOV A,OSIntNesting
CJNE A,#01H,?C0005
; {
; SOURCE LINE # 224
; #pragma ASM
; PUSH IE
PUSH IE
; #pragma ENDASM
; EA=0;
; SOURCE LINE # 228
CLR EA
; #pragma ASM
; //SaveC_IBP=C_IBP;
; //SaveSP=SP;
; MOV SaveC_IBP,?C_IBP
MOV SaveC_IBP,?C_IBP
; MOV SaveSP,SP
MOV SaveSP,SP
; #pragma ENDASM
; OSTCBCur->OSTCBStkPtr = C_XBP; /* OSTCBCur->OSTCBStkPtr is free now, so it can be used to story the value of SP */
; SOURCE LINE # 235
MOV R0,#LOW (OSTCBCur)
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV DPL,A
MOV DPH,R6
MOV A,C_XBP
MOVX @DPTR,A
INC DPTR
MOV A,C_XBP+01H
MOVX @DPTR,A
; EA=1;
; SOURCE LINE # 236
SETB EA
; }
; SOURCE LINE # 237
?C0005:
; OSTimeTick(); /* Must be called during tick isr */
; SOURCE LINE # 238
LCALL OSTimeTick
; OSIntExit(); /* Must be called finally at every hardware interupt exit point */
; SOURCE LINE # 239
LCALL OSIntExit
; if(OSIntNesting==0)
; SOURCE LINE # 240
MOV A,OSIntNesting
JNZ ?C0007
; {
; SOURCE LINE # 241
; EA=0;
; SOURCE LINE # 242
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -