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

📄 os_cpu_a.asm

📁 一个关于UCOS的KEIL工程
💻 ASM
字号:
;********************************************************************************************************
;                                               uC/OS-II
;                                         The Real-Time Kernel
;
;                          (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
;                                          All Rights Reserved
;
;
;                                        8051/8052 Specific code
;                                          LARGE MEMORY MODEL
;
;                                        Keil C Compiler V6.23a
;                                       (MSC51 Compatible Target)
;
; File         : OS_CPU_A.ASM
; By           : Jean J. Labrosse
; Replant      : wl.peng
;********************************************************************************************************

            NAME    OS_CPU_A
            
;********************************************************************************************************
;                                    PUBLIC and EXTERNAL REFERENCES
;********************************************************************************************************
		
?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
?STACK      						SEGMENT     IDATA
DT?OS_CPU_A 						SEGMENT     DATA
		
	PUBLIC  _?OSTickISR
	PUBLIC  _?OSStartHighRdy
	PUBLIC  _?OSCtxSw
	PUBLIC  _?OSIntCtxSw
	PUBLIC  OSTickRate
	PUBLIC  OSTickCtr
	
	EXTRN	DATA 	(?C_XBP)
	EXTRN   XDATA   (OSTCBCur)
	EXTRN   XDATA   (OSTCBHighRdy)              
	EXTRN   XDATA   (OSPrioCur)                 
	EXTRN   XDATA   (OSPrioHighRdy)             
	EXTRN   XDATA   (OSRunning)                 
	                                            
	EXTRN   CODE    (_?OSIntEnter)              
	EXTRN   CODE    (_?OSIntExit)               
	EXTRN   CODE    (_?OSTimeTick)              
	EXTRN   CODE    (_?OSTaskSwHook)
                                            
;********************************************************************************************************
;                                           MACRO DEFINE
;********************************************************************************************************
                                            
PUSHALL     MACRO
            PUSH        ACC
            PUSH        B
            PUSH        DPH
            PUSH        DPL
            PUSH        PSW
            
            IRP         REG,    <R0, R1, R2, R3, R4, R5, R6, R7>
            MOV         A,      REG
            PUSH        ACC
            ENDM
            
            ENDM            


POPALL      MACRO
            IRP         REG,    <R7, R6, R5, R4, R3, R2, R1, R0>
            POP         ACC
            MOV         REG,    A
            ENDM
            
            POP         PSW
            POP         DPL
            POP         DPH
            POP         B
            POP         ACC
            ENDM


LoadXBP     MACRO
            MOV         DPH,    ?C_XBP
            MOV         DPL,    ?C_XBP+1
            ENDM


SaveXBP     MACRO
            ;PUSH        IE
            ;CLR         EA
            MOV          ?C_XBP,  DPH
            MOV          ?C_XBP+1,DPL
            ;POP         IE
            ENDM


LoadReg     MACRO       REG
            MOVX        A,      @DPTR
            MOV         REG,    A
            ENDM
            

SaveReg     MACRO       REG
            MOV         A,      REG
            MOVX        @DPTR,  A
            ENDM

            
;********************************************************************************************************
;                                           VARIABLE DEFINE
;********************************************************************************************************

            RSEG        ?STACK
		    DS			1                                        ; SP start address (acllocation by keil c)

            RSEG        DT?OS_CPU_A
OSTickRate:
            DS          1
OSTickCtr:
            DS          1

;********************************************************************************************************
;                                    void _?OSStartHighRdy(void);
;********************************************************************************************************           

            RSEG        ?PR?_?OSStartHighRdy?OS_CPU_A
_?OSStartHighRdy:
            
            LCALL       _?OSTaskSwHook
            
            ; OSRunning = TRUE;
            MOV			DPL,		#LOW(OSRunning)
            MOV			DPH,		#HIGH(OSRunning)
            SaveReg		#01
            
            LJMP        ?C_XBP_Load

;********************************************************************************************************
;                                    void OSCtxSw(void);
;********************************************************************************************************
            
            RSEG        ?PR?_?OSCtxSw?OS_CPU_A
_?OSCtxSw:
            PUSHALL
SP_Offset:
            LoadXBP
            
            MOV         A,      SP
            CLR         C
            SUBB        A,      #?STACK-1
            MOV			R5,		A
            INC         A
            CLR         C
            XCH         A,      DPL
            SUBB        A,      DPL
            JNC         SP_Save
            DEC         DPH
SP_Save:
            MOV         DPL,    A
            
            SaveXBP
            
            SaveREG     R5
            
            MOV         R0,     #?STACK-1          
Stack_Save_Loop:
            INC         DPTR
            INC         R0
            SaveREG     @R0
            DJNZ        R5,     Stack_Save_Loop
            
            ;POPALL
            
            ; OSTCBCur->OSTCBStkPtr = ?C_XBP;
            MOV			DPL,	#LOW(OSTCBCur)
            MOV			DPH,	#HIGH(OSTCBCur)
            INC			DPTR
            LoadReg		R0
            INC			DPTR
            LoadReg		DPL
            MOV			DPH,	R0
            INC         DPTR
            SaveReg   	?C_XBP
            INC         DPTR
            SaveReg   	?C_XBP+1
            
            LCALL       _?OSTaskSwHook
            
            ; OSTCBCur = OSTCBHighRdy;
            MOV			DPL,	#LOW(OSTCBHighRdy)
            MOV			DPH,	#HIGH(OSTCBHighRdy)
            LoadReg   	R0
            INC         DPTR
            LoadReg   	R1
            INC         DPTR
            LoadReg   	R2
            MOV			DPL,	#LOW(OSTCBCur)
            MOV			DPH,	#HIGH(OSTCBCur)
            SaveReg   	R0
            INC         DPTR
            SaveReg   	R1
            INC         DPTR
            SaveReg   	R2
            
            ; OSPrioCur = OSPrioHighRdy;
            MOV			DPL,	#LOW(OSPrioHighRdy)
            MOV			DPH,	#HIGH(OSPrioHighRdy)
            LoadReg		R0
            MOV			DPL,	#LOW(OSPrioCur)
            MOV			DPH,	#HIGH(OSPrioCur)
            SaveReg   	R0
            
?C_XBP_Load:            
            ; ?C_XBP = OSTCBCur->OSTCBStkPtr;
            MOV			DPL,	#LOW(OSTCBCur)
            MOV			DPH,	#HIGH(OSTCBCur)
            INC			DPTR
            LoadReg		R0
            INC			DPTR
            LoadReg		DPL
            MOV			DPH,	R0
            INC         DPTR
            LoadReg   	?C_XBP
            INC         DPTR
            LoadReg   	?C_XBP+1
            
SP_Load:
            LoadXBP
            
            LoadREG     R5
            
            MOV         R0,     #?STACK-1
Stack_Load_Loop:            
            INC         DPTR
            INC         R0
            LoadREG     @R0
            DJNZ        R5,     Stack_Load_Loop
            
            MOV			SP,		R0
            
            INC         DPTR
            SaveXBP
            
            ; OSTCBCur->OSTCBStkPtr = ?C_XBP;
            
            POPALL
            
            RET

;********************************************************************************************************
;                                    void OSIntCtxSw(void);
;********************************************************************************************************

            RSEG        ?PR?_?OSIntCtxSw?OS_CPU_A
_?OSIntCtxSw:
            DEC         SP
            DEC         SP
            DEC         SP
            DEC         SP
            LJMP        SP_Offset

;********************************************************************************************************
;                                    void OSTickISR(void);
;********************************************************************************************************

            CSEG        AT          000BH
            LJMP        _?OSTickISR
            
            RSEG        ?PR?_?OSTickISR?OS_CPU_A
_?OSTickISR:
            LCALL       ResetHwIntr
            PUSHALL
            
            ;DEC         OSTickCtr
            ;MOV         A,      OSTickCtr   
            ;JNZ         OSTick_End
            ;MOV         OSTickCtr,  OSTickRate
            
            LCALL       _?OSIntEnter
            LCALL       _?OSTimeTick
            LCALL       _?OSIntExit
OSTick_End:         
            POPALL
            RET
            
ResetHwIntr:            
            RETI
            
            END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -