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

📄 os_cpu_a_i.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
;********************************************************************************************************

            PUBLIC  _?OSTickISR
            PUBLIC  _?OSStartHighRdy
            PUBLIC  _?OSCtxSw
            PUBLIC  _?OSIntCtxSw
            
            EXTRN   IDATA   (OSTCBCur)
            EXTRN   IDATA   (OSTCBHighRdy)
            EXTRN   IDATA   (OSPrioCur)
            EXTRN   IDATA   (OSPrioHighRdy)
            EXTRN   IDATA   (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
;********************************************************************************************************

            ?STACK      SEGMENT     IDATA
            RSEG        ?STACK
OSStack:                                            ; SP start address (acllocation by keil c)

            DT?C_XBP    SEGMENT     DATA
            RSEG        DT?C_XBP
?C_XBP:                                             ; Data stack pointer (acllocation by keil c)
C_XBP:      DS          1

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

;********************************************************************************************************
;                                    void OSStartHighRdy(void);
;********************************************************************************************************           

            ?PR?OSStartHighRdy?OS_CPU_A     SEGMENT     CODE
            RSEG        ?PR?OSStartHighRdy?OS_CPU_A
_?OSStartHighRdy:
            
            LCALL       _?OSTaskSwHook
            
            ; OSRunning = TRUE;
            MOV			R0,			#OSRunning
            MOV			@R0,		#01
            
            LJMP        C_XBP_Load

;********************************************************************************************************
;                                    void OSCtxSw(void);
;********************************************************************************************************
            
            ?PR?OSCtxSw?OS_CPU_A            SEGMENT     CODE
            RSEG        ?PR?OSCtxSw?OS_CPU_A
_?OSCtxSw:
            PUSHALL
SP_Offset:
            LoadXBP
            
            MOV         A,      SP
            CLR         C
            SUBB        A,      #OSStack-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
            INC         DPTR
            
            MOV         R0,     #OSStack          
Stack_Save_Loop:
            SaveREG     @R0
            INC         DPTR
            INC         R0
            DJNZ        R5,     Stack_Save_Loop
            
            ;POPALL
            
            ; OSTCBCur->OSTCBStkPtr = C_XBP;
            MOV         R0,     #LOW(OSTCBCur)
            INC         R0
            MOV         DPH,    @R0
            INC         R0
            MOV         DPL,    @R0
            INC         DPTR
            MOV         A,      C_XBP
            MOVX        @DPTR,  A
            INC         DPTR
            MOV         A,      C_XBP+1
            MOVX        @DPTR,  A
            
            LCALL       _?OSTaskSwHook
            
            ; OSTCBCur = OSTCBHighRdy;
            MOV         R0,     #OSTCBCur
            MOV         R1,     #OSTCBHighRdy
            MOV         A,      @R1
            MOV         @R0,    A
            INC         R0
            INC         R1
            MOV         A,      @R1
            MOV         @R0,    A
            INC         R0
            INC         R1
            MOV         A,      @R1
            MOV         @R0,    A
            
            ; OSPrioCur = OSPrioHighRdy;
            MOV         R0,     #OSPrioCur
            MOV         R1,     #OSPrioHighRdy
            MOV         A,      @R1
            MOV         @R0,    A
C_XBP_Load:            
            ; C_XBP = OSTCBCur->OSTCBStkPtr;
            MOV         R0,     #LOW(OSTCBCur)
            INC         R0
            MOV         DPH,    @R0
            INC         R0
            MOV         DPL,    @R0
            INC         DPTR
            MOVX        A,      @DPTR
            MOV         C_XBP,  A
            INC         DPTR
            MOVX        A,      @DPTR
            MOV         C_XBP+1,A
            
SP_Load:
            LoadXBP
            
            LoadREG     R5
            
            MOV         R0,     #OSStack-1
Stack_Load_Loop:            
            INC         DPTR
            INC         R0
            LoadREG     @R0
            DJNZ        R5,     Stack_Load_Loop
            
            MOV			SP,		R5
            
            SaveXBP
            
            ; OSTCBCur->OSTCBStkPtr = C_XBP;
            
            POPALL
            
            RET

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

            ?PR?OSIntCtxSw?OS_CPU_A         SEGMENT     CODE
            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
            
            ?PR?OSTickISR?OS_CPU_A          SEGMENT     CODE
            RSEG        ?PR?OSTickISR?OS_CPU_A
_?OSTickISR:
            LCALL       ResetHwIntr
            
            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 + -