📄 os_cpu_a.asm
字号:
$NOMOD51
;伪指令详细用法请查A51.PDF文件
;程序结构详见《uC/OS-II》193-198页
;不用此语句!!! $CASE ;标号和变量名区分大小写
EA BIT 0A8H.7
SP DATA 081H
B DATA 0F0H
ACC DATA 0E0H
DPH DATA 083H
DPL DATA 082H
PSW DATA 0D0H
TR0 BIT 088H.4
TF0 BIT 088H.5
TH0 DATA 08CH
TL0 DATA 08AH
NAME OS_CPU_A
?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSTickISR?OS_CPU_A SEGMENT CODE
EXTRN DATA(OSTCBHighRdy)
EXTRN DATA(OSTCBCur)
EXTRN IDATA(STACK)
EXTRN DATA(OSRunning)
EXTRN DATA(OSPrioCur)
EXTRN DATA(OSPrioHighRdy)
EXTRN DATA(?C_XBP)
EXTRN CODE (ReloadTimer0)
EXTRN CODE (_?OSTaskSwHook)
EXTRN CODE (_?OSIntEnter)
EXTRN CODE (_?OSIntExit)
EXTRN CODE (_?OSTimeTick)
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw
PUBLIC OSIntCtxSw
PUBLIC OSTickISR
PUSHALL MACRO
IRP REG , <ACC, B, DPH, DPL, PSW, 0, 1, 2, 3, 4 ,5, 6, 7>
PUSH REG
ENDM
ENDM
POPALL MACRO
IRP REG , <7, 6, 5, 4, 3, 2, 1, 0, PSW, DPL, DPH, B, ACC>
POP REG
ENDM
ENDM
RSEG ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy:
LCALL _?OSTaskSwHook
MOV OSRunning,#1
MOV DPH, OSTCBHighRdy+1 ;ostcbhighrdy point to tcb
MOV DPL, OSTCBHighRdy+2 ;OSTCBHIGHRDY IS A GENERIC POINTER
MOV R3, DPH
MOV R4, DPL ;DPTR POINTER TO OSTCBSTKPTR
MOVX A, @DPTR ;STACK POINTER MSB
INC DPTR
MOV B, A
MOVX A, @DPTR ;STACK POINTER LSB
MOV DPH, B
MOV DPL, A
MOVX A, @DPTR ;THE LENGTH OF THE STACK
MOV R0, A
MOV A, DPL
CLR C
;DEC A
SUBB A, R0
MOV DPL, A
MOV A, DPH
SUBB A, #0
MOV DPH, A ;DPTR POINT TO THE LOW ADDRESS OF STACK
MOV R5, DPH
MOV R6, DPL
MOV DPH, R3
MOV DPL, R4
MOV A, R5
MOVX @DPTR, A
MOV A, R6
INC DPTR
MOVX @DPTR, A ;OSTCBSTKPTR POINT TO THE LOW ADDRESS OF STACK
MOV DPH, R5
MOV DPL, R6
;CLR C
;MOV A, R6
;ADD A, #080H
;MOV ?C_XBP+1,A
;MOV A, R5
;ADDC A, #0
;MOV ?C_XBP,A
MOV R1, #STACK-1
LOADST: INC R1
MOVX A, @DPTR
MOV @R1, A
INC DPTR
DJNZ R0, LOADST ;RESTORE THE EXTERN STACK TO INTERNAL STACK
INC DPTR
MOVX A, @DPTR
MOV ?C_XBP, A
INC DPTR
MOVX A, @DPTR
MOV ?C_XBP+1, A
MOV SP, R1 ;RESTORE SP
POPALL
RETI
;
RSEG ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:
PUSHALL
int_in: MOV A, SP
MOV R1, #STACK-1
CLR C
SUBB A, R1
MOV R0, A ;R0 IS THE LENGTH OF STACK
MOV R5, A
MOV DPH, OSTCBCur+1
MOV DPL, OSTCBCur+2 ;DPTR IS THE POINTER TO THE TCB
MOVX A, @DPTR
MOV R2, A
INC DPTR
MOVX A, @DPTR
MOV R3, A
MOV DPH, R2
MOV DPL, R3
STOREST:INC R1
MOV A, @R1
MOVX @DPTR, A
INC DPTR
DJNZ R0, STOREST ;SOTRE THE INTERNAL STACK TO THE EXTERN STACK
MOV A, R5
MOVX @DPTR, A ;STORE THE LENGTH OF THE STACK
MOV R2, DPH
MOV R3, DPL
INC DPTR
MOV A, ?C_XBP
MOVX @DPTR, A
INC DPTR
MOV A, ?C_XBP+1
MOVX @DPTR, A
MOV DPH, OSTCBCur+1
MOV DPL, OSTCBCur+2
MOV A, R2
MOVX @DPTR, A
INC DPTR
MOV A, R3
MOVX @DPTR, A
MOV A,OSTCBHighRdy
MOV OSTCBCur,A
MOV A,OSTCBHighRdy+1
MOV OSTCBCur+1,A
MOV A,OSTCBHighRdy+2
MOV OSTCBCur+2,A
MOV A, OSPrioHighRdy
MOV OSPrioCur,A
LJMP OSStartHighRdy
RSEG ?PR?OSIntCtxSw?OS_CPU_A
OSIntCtxSw:
MOV A,SP
CLR C
SUBB A,#4
MOV SP,A
LJMP int_in
CSEG AT 000BH ;OSTickISR
LJMP OSTickISR ;使用定时器0
RSEG ?PR?OSTickISR?OS_CPU_A
OSTickISR:
USING 0
PUSHALL
LCALL _?OSIntEnter
LCALL ReloadTimer0
LCALL _?OSTimeTick
LCALL _?OSIntExit
POPALL
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -