os_cpu_c.src
来自「我移植的uCos 2.52版本,在MCS51上运行,代码进行了一些优化,可以编译」· SRC 代码 · 共 1,279 行 · 第 1/3 页
SRC
1,279 行
JNZ ?C0028
DEC @R0
?C0028:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#02H
MOVX @DPTR,A
; PUSH(3); // should be R3
; SOURCE LINE # 102
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0029
DEC @R0
?C0029:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#03H
MOVX @DPTR,A
;
; // stk += sizeof(void *); /* Keil C uses R1,R2,R3 to pass the */
; // *(void**)stk = vd; /* arguments of functions. */
;
; PUSH(4); /* R4 */
; SOURCE LINE # 107
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0030
DEC @R0
?C0030:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#04H
MOVX @DPTR,A
; PUSH(5); /* R5 */
; SOURCE LINE # 108
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0031
DEC @R0
?C0031:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#05H
MOVX @DPTR,A
; PUSH(6); /* R6 */
; SOURCE LINE # 109
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0032
DEC @R0
?C0032:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#06H
MOVX @DPTR,A
; PUSH(7); /* R7 */
; SOURCE LINE # 110
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0033
DEC @R0
?C0033:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#07H
MOVX @DPTR,A
;
; /* Following is the registers pushed into hardware stack manually to support the dallas 390 */
; PUSH(0x80); /* IE, EA is enabled */
; SOURCE LINE # 113
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0034
DEC @R0
?C0034:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
MOV A,#080H
MOVX @DPTR,A
; /*
; 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 # 125
MOV R7,#LOW (STACK_START+0EH)
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0035
DEC @R0
?C0035:
DEC A
MOV AR4,@R0
MOV DPL,A
MOV DPH,R4
MOV A,R7
MOVX @DPTR,A
; PUSH(0); /* C_IBP *--CIBP */
; SOURCE LINE # 126
MOV R0,?C_IBP
INC R0
MOV A,@R0
DEC @R0
DEC R0
JNZ ?C0036
DEC @R0
?C0036:
DEC A
MOV AR6,@R0
MOV DPL,A
MOV DPH,R6
CLR A
MOVX @DPTR,A
; return ((void *)stk);
; SOURCE LINE # 127
MOV R0,?C_IBP
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
; }
; SOURCE LINE # 128
?C0001:
MOV A,?C_IBP
ADD A,#0AH
MOV ?C_IBP,A
RET
; END OF _?OSTaskStkInit
;
; OS_EXT OS_TCB _IDATA *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 */
;
; extern INT8U xdata * data C_XBP;
; //extern INT8U * data C_IBP;
; /*
; ***********************************************************************************************************
; * 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
; {
; OSTaskSwHook();
; SOURCE LINE # 148
LCALL _?OSTaskSwHook
; OSRunning=1;
; SOURCE LINE # 149
MOV OSRunning,#01H
;
; C_XBP=OSTCBHighRdy->OSTCBStkPtr;
; SOURCE LINE # 151
MOV R0,OSTCBHighRdy
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
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
; {
; /* 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,OSTCBCur
MOV @R0,C_XBP
INC R0
MOV @R0,C_XBP+01H
;
; OSTaskSwHook();
; SOURCE LINE # 176
LCALL _?OSTaskSwHook
; OSTCBCur = OSTCBHighRdy;
; SOURCE LINE # 177
MOV OSTCBCur,OSTCBHighRdy
; OSPrioCur = OSPrioHighRdy;
; SOURCE LINE # 178
MOV OSPrioCur,OSPrioHighRdy
;
; C_XBP = OSTCBCur->OSTCBStkPtr;
; SOURCE LINE # 180
MOV R0,OSTCBCur
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
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
; {
; 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,OSTCBCur
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
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 OS_TIME_ISR
RSEG ?PR?OSTickISR?OS_CPU_C
USING 0
OSTickISR:
PUSH ACC
PUSH B
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,#098H
; 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,OSTCBCur
MOV @R0,C_XBP
INC R0
MOV @R0,C_XBP+01H
; 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 + =
减小字号Ctrl + -
显示快捷键?