⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_a.asm

📁 ucos-ii在C8051F020上的移植
💻 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 + -