📄 os_cpu_a.src
字号:
; +0A USER STACK OFFSET POINTER (R0) of task
; +08 USER STACK PAGE POINTER (DPP1) of task
; +06 PSW flags of task
; +04 OFFSET of task return address
; 02 SEGMENT of task return address
; OSTCBHighRdy->OSTCBStkPtr --> 0
; -02 R[1 ..15] General Purpose registers of task
; -20 CP Context pointer of task
; -22 DPP3 Data page pointer 3 of task
; -24 DPP2 Data page pointer 2 of task
; -26 DPP0 Data page pointer 0 of task
; -28 MDC Multiply/Divide Control of task
; -2A MDH Multiply/Divide High register of task
; -2C MDL Multiply/Divide Low register of task (Low Memory)
;********************************************************************************************************
UCOS_C16X SECTION CODE
_OSCtxSw PROC TASK UCOS_OSCtxSw INTNO=50h
BCLR IEN ; Disable interrupts
; Total execution time : xx states.
MOV [-R0],R1 ; Save R1
MOV [-R0],R2 ; Save R2
MOV [-R0],R3 ; Save R3
MOV [-R0],R4 ; Save R4
MOV [-R0],R5 ; Save R5
MOV [-R0],R6 ; Save R6
MOV [-R0],R7 ; Save R7
MOV [-R0],R8 ; Save R8
MOV [-R0],R9 ; Save R9
MOV [-R0],R10 ; Save R10
MOV [-R0],R11 ; Save R11
MOV [-R0],R12 ; Save R12
MOV [-R0],R13 ; Save R13
MOV [-R0],R14 ; Save R14
MOV [-R0],R15 ; Save R15
MOV R4,CP ; Get Context Pointer (CP)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,DPP3 ; Get Data Page Pointer 3 (DPP3)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,DPP2 ; Get Data Page Pointer 2 (DPP2)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,DPP0 ; Get Data Page Pointer 0 (DPP0)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,MDC ; Get Multiply/Divide Control (MDC)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,MDH ; Get Multiply/Divide High (MDH)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,MDL ; Get Multiply/Divide Low (MDL)
MOV [-R0],R4 ; Put it on the user stack; Save Register Context
EXTP #PAG _OSTCBCur,#02h ; pStack = OSTCBCur->OSTCBStkPtr
MOV R8,POF (_OSTCBCur) ; pStack = R9:R8
MOV R9,POF (_OSTCBCur+2)
EXTP R9,#02h
MOV R6,[R8+]
MOV R7,[R8]
MOV R5,SP ; Get Task Return Address
MOV R3,[R5+#04h] ; Get "current" PSW =(SP + 2)
MOV R1,[R5+#02h] ; Get "current" CSP =(SP + 1)
MOV R2,[R5] ; Get "current" IP =(SP + 0)
MOV R4,DPP1 ; Get "current" DPP1
EXTP R7,#02h ; Save this task's interrupt context on user stack
MOV [R6+#02H],R1 ; Task CSP
MOV [R6+#04H],R2 ; Task IP
EXTP R7,#03h
MOV [R6+#06H],R3 ; Task STATUS
MOV [R6+#08H],R4 ; Task DPP1
MOV [R6+#0AH],R0 ; Task R0
MOV R9,#SOF _ADDR01 ; Call user defined task switch hook
MOV [-R0],R9
MOV R9,#SEG _ADDR01
MOV [-R0],R9
JMPS SEG( _OSTaskSwHook),SOF( _OSTaskSwHook)
_ADDR01:
EXTP #PAG _OSTCBHighRdy,#02h ; Get the stack pointer of the task to resume
MOV R8,POF _OSTCBHighRdy ; OSTCBCur = OSTCBHighRdy
MOV R9,POF (_OSTCBHighRdy+2)
EXTP #PAG _OSTCBCur,#02h
MOV POF (_OSTCBCur),R8
MOV POF (_OSTCBCur+2),R9
EXTP #PAG _OSPrioHighRdy,#01h ; OSPrioCur = OSPrioHighRdy;
MOVB RL1,POF _OSPrioHighRdy
EXTP #PAG _OSPrioCur,#01h
MOVB POF _OSPrioCur,RL1
EXTP R9,#02h ; R7:R6 = OSTCBHighRdy->OSTCBStkPtr
MOV R6,[R8+]
MOV R7,[R8]
EXTP R7,#02h ; Load this task's interrupt context on the system stack
MOV R1,[R6+#02h] ; Get Task CSP
MOV R2,[R6+#04h] ; Get Task IP
EXTP R7,#03h
MOV R3,[R6+#06h] ; Get Task STATUS
MOV R4,[R6+#08h] ; Get Task DPP1
MOV R0,[R6+#0Ah] ; Get Task R0
MOV DPP1,R4
MOV [R5+#04h],R3 ; Load "saved" PSW
MOV [R5+#02h],R1 ; Load "saved" CSP
MOV [R5],R2 ; Load "saved" IP
MOV R1,[R0+] ; Restore MDL
MOV MDL,R1 ;
MOV R1,[R0+] ; Restore MDH
MOV MDH,R1 ;
MOV R1,[R0+] ; Restore MDC
MOV MDC,R1 ;
MOV R1,[R0+] ; Restore DPP0
MOV DPP0,R1 ;
MOV R1,[R0+] ; Restore DPP2
MOV DPP2,R1 ;
MOV R1,[R0+] ; Restore DPP3
MOV DPP3,R1 ;
MOV R1,[R0+] ; Restore CP
MOV CP,R1 ;
NOP
MOV R15,[R0+] ; Restore R15
MOV R14,[R0+] ; Restore R14
MOV R13,[R0+] ; Restore R13
MOV R12,[R0+] ; Restore R12
MOV R11,[R0+] ; Restore R11
MOV R10,[R0+] ; Restore R10
MOV R9,[R0+] ; Restore R9
MOV R8,[R0+] ; Restore R8
MOV R7,[R0+] ; Restore R7
MOV R6,[R0+] ; Restore R6
MOV R5,[R0+] ; Restore R5
MOV R4,[R0+] ; Restore R4
MOV R3,[R0+] ; Restore R3
MOV R2,[R0+] ; Restore R2
MOV R1,[R0+] ; Restore R1; Restore General Purpose Registers
BSET IEN ; Enable interrupts
RETI ; Return to new task
_OSCtxSw ENDP
UCOS_C16X ENDS
;********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
; Note(s): 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The system stack frame of the task to suspend looks as follows:
; SYSTEM STACK AREA
; SP -> +0 OFFSET of task to suspend (Low memory)
; +2 SEGMENT of task to suspend
; +4 PSW of task to suspend (High memory)
;
; 3) The user stack frame of the task to resume looks as follows:
;
; TASK STACK AREA (High Memory)
; +12 TASK DATA PARAMETER PAGE pointer of task
; +10 TASK DATA PARAMETER OFFSET pointer of task
; +0E SEGMENT of task code address
; +0C OFFSET of task code address
; +0A USER STACK OFFSET POINTER (R0) of task
; +08 USER STACK PAGE POINTER (DPP1) of task
; +06 PSW flags of task
; +04 OFFSET of task return address
; +02 SEGMENT of task return address
; OSTCBHighRdy->OSTCBStkPtr --> 0
; -02 R[1 ..15] General Purpose registers of task
; -20 CP Context pointer of task
; -22 DPP3 Data page pointer 3 of task
; -24 DPP2 Data page pointer 2 of task
; -26 DPP0 Data page pointer 0 of task
; -28 MDC Multiply/Divide Control of task
; -2A MDH Multiply/Divide High register of task
; -2C MDL Multiply/Divide Low register of task
; -2E Calls to OsIntExit, OSIntCtxSw and locals. (Low Memory)
;********************************************************************************************************
UCOS_C16X SECTION CODE
_OSIntCtxSw PROC FAR
ADD R0,#8 ; Ignore calls to OSIntExit,OSIntCtxSw and locals.
EXTP #PAG _OSTCBCur,#02h ; Load Task stack pointer from current TCB
MOV R8,POF (_OSTCBCur) ; R7:R6 = OSTCBCur->OSTCBStkPtr
MOV R9,POF (_OSTCBCur+2)
EXTP R9,#02h
MOV R6,[R8+]
MOV R7,[R8]
MOV R5,SP
MOV R3,[R5+#04h] ; Get "current" PSW
MOV R1,[R5+#02h] ; Get "current" CSP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -