📄 os_cpu.c
字号:
PUSH B
PUSH DPH
PUSH DPL
PUSH 0
PUSH 1
PUSH 2
PUSH 3
PUSH 4
PUSH 5
PUSH 6
PUSH 7
/* push internal stack pointer onto the external stack */
MOV A,?stack Decrement external stack pointer by 1
CLR PSW.7
SUBB A,#1
MOV ?stack,A
MOV A,?stack+1
SUBB A,#0
MOV ?stack+1,A
MOV A,?stack set up dptr with the new external stack pointer value
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOV A,SP move internal stack pointer value into xternal stack
MOVX [DPTR],A
/* start pushing the internal ram onto the external ram */
MOV B,#$7F-?stk We have 0x7F-?stk bytes to move starting from hi to low
_CSPUSHA MOV A,B
ADD A,#?stk
MOV R0,A
MOV A,?stack Decrement external stack pointer by 1
CLR PSW.7
SUBB A,#1
MOV ?stack,A
MOV A,?stack+1
SUBB A,#0
MOV ?stack+1,A
MOV A,?stack set up dptr with the new external stack pointer value
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOV A,[R0]
MOVX [DPTR],A
MOV A,B
CLR PSW.7
SUBB A,#1
MOV B,A
CJNE A,#0,_CSPUSHA
/* Switch the external stack pointer now */
MOV DPTR,#OSTCBCur
MOVX A,[DPTR]
MOV R0,A
INC DPTR
MOVX A,[DPTR]
MOV R1,A
MOV DPL,R0
MOV DPH,R1
MOV A,?stack
MOVX [DPTR],A
INC DPTR
MOV A,?stack+1
MOVX [DPTR],A
MOV DPTR,#OSTCBHighRdy
MOVX A,[DPTR]
MOV R0,A
INC DPTR
MOVX A,[DPTR]
MOV R1,A
MOV DPL,R0
MOV DPH,R1
MOVX A,[DPTR]
MOV ?stack,A
INC DPTR
MOVX A,[DPTR]
MOV ?stack+1,A
/* Call user defined function */
LCALL OSTaskSwHook
/* OSTCBCur = OSTCBHighRdy */
MOV DPTR,#OSTCBHighRdy
MOVX A,[DPTR]
MOV R0,A
INC DPTR
MOVX A,[DPTR]
MOV R1,A
MOV DPTR,#OSTCBCur
MOV A,R0
MOVX [DPTR],A
INC DPTR
MOV A,R1
MOVX [DPTR],A
/* OSPrioCur = OSPrioHighRdy */
MOV DPTR,#OSPrioHighRdy
MOVX A,[DPTR]
MOV DPTR,#OSPrioCur
MOVX [DPTR],A
/* pop all internal stack values from external stack back to internal ram */
MOV B,#0 We have 0x7F-?stk bytes to move starting from low to high
_CSPOPA MOV A,B
ADD A,#1
MOV B,A
ADD A,#?stk
MOV R0,A
MOV A,?stack
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOVX A,[DPTR]
MOV [R0],A
MOV A,?stack
ADD A,#1
MOV ?stack,A
MOV A,?stack+1
ADDC A,#0
MOV ?stack+1,A
MOV A,B
CJNE A,#$7F-?stk,_CSPOPA
_CSPOPADONE
/* pop internal stack pointer */
MOV A,?stack
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOVX A,[DPTR]
MOV SP,A
MOV A,?stack
ADD A,#1
MOV ?stack,A
MOV A,?stack+1
ADDC A,#0
MOV ?stack+1,A
/* restore processor registers */
POP 7
POP 6
POP 5
POP 4
POP 3
POP 2
POP 1
POP 0
POP DPL
POP DPH
POP B
POP A
SETB IE.7 Have to turn the interrupt back on
POP PSW
}
}
void OSIntCtxSw()
{
asm {
/* Remove calls to OSIntExit and OSIntCtxSw,
and the call to the ISR itself see 8051INT.h
for details */
XCH A,SP
CLR PSW.7
SUBB A,#6
XCH A,SP
/* push internal stack pointer onto the external stack */
MOV A,?stack Decrement external stack pointer by 1
CLR PSW.7
SUBB A,#1
MOV ?stack,A
MOV A,?stack+1
SUBB A,#0
MOV ?stack+1,A
MOV A,?stack set up dptr with the new external stack pointer value
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOV A,SP move internal stack pointer value into xternal stack
MOVX [DPTR],A
/* start pushing the internal ram onto the external ram */
MOV B,#$7F-?stk We have 0x7F-?stk bytes to move starting from hi to low
_ICSPUSHA MOV A,B
ADD A,#?stk
MOV R0,A
MOV A,?stack Decrement external stack pointer by 1
CLR PSW.7
SUBB A,#1
MOV ?stack,A
MOV A,?stack+1
SUBB A,#0
MOV ?stack+1,A
MOV A,?stack set up dptr with the new external stack pointer value
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOV A,[R0]
MOVX [DPTR],A
MOV A,B
CLR PSW.7
SUBB A,#1
MOV B,A
CJNE A,#0,_ICSPUSHA
/* Switch the external stack pointer now */
MOV DPTR,#OSTCBCur
MOVX A,[DPTR]
MOV R0,A
INC DPTR
MOVX A,[DPTR]
MOV R1,A
MOV DPL,R0
MOV DPH,R1
MOV A,?stack
MOVX [DPTR],A
INC DPTR
MOV A,?stack+1
MOVX [DPTR],A
MOV DPTR,#OSTCBHighRdy
MOVX A,[DPTR]
MOV R0,A
INC DPTR
MOVX A,[DPTR]
MOV R1,A
MOV DPL,R0
MOV DPH,R1
MOVX A,[DPTR]
MOV ?stack,A
INC DPTR
MOVX A,[DPTR]
MOV ?stack+1,A
/* Call user defined function */
LCALL OSTaskSwHook
/* OSTCBCur = OSTCBHighRdy */
MOV DPTR,#OSTCBHighRdy
MOVX A,[DPTR]
MOV R0,A
INC DPTR
MOVX A,[DPTR]
MOV R1,A
MOV DPTR,#OSTCBCur
MOV A,R0
MOVX [DPTR],A
INC DPTR
MOV A,R1
MOVX [DPTR],A
/* OSPrioCur = OSPrioHighRdy */
MOV DPTR,#OSPrioHighRdy
MOVX A,[DPTR]
MOV DPTR,#OSPrioCur
MOVX [DPTR],A
/* pop all internal stack values from external stack back to internal ram */
MOV B,#0 We have 0x7F-?stk bytes to move starting from low to high
_ICSPOPA MOV A,B
ADD A,#1
MOV B,A
ADD A,#?stk
MOV R0,A
MOV A,?stack
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOVX A,[DPTR]
MOV [R0],A
MOV A,?stack
ADD A,#1
MOV ?stack,A
MOV A,?stack+1
ADDC A,#0
MOV ?stack+1,A
MOV A,B
CJNE A,#$7F-?stk,_ICSPOPA
_ICSPOPADONE
/* pop internal stack pointer */
MOV A,?stack
MOV DPL,A
MOV A,?stack+1
MOV DPH,A
MOVX A,[DPTR]
MOV SP,A
MOV A,?stack
ADD A,#1
MOV ?stack,A
MOV A,?stack+1
ADDC A,#0
MOV ?stack+1,A
/* restore processor registers */
POP 7
POP 6
POP 5
POP 4
POP 3
POP 2
POP 1
POP 0
POP DPL
POP DPH
POP B
POP A
POP PSW
SETB IE.7
RETI
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -