?? os_cpu_a.asm
字號:
; -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
@SaveContext ; 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
@RestoreContext ; 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
MOV R2,[R5] ; Get "current" IP
MOV R4,DPP1 ; Get "current" DPP1
EXTP R7,#02h ; Save this task's interrupt context in task 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 _ADDR02 ; Call user defined task switch hook
MOV [-R0],R9
MOV R9,#SEG _ADDR02
MOV [-R0],R9
JMPS SEG( _OSTaskSwHook),SOF( _OSTaskSwHook)
_ADDR02:
EXTP #PAG (_OSTCBHighRdy),#02h ; OSTCBCur = OSTCBHighRdy
MOV R8,POF (_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 ; Get the stack pointer of the task to resume
MOV R6,[R8+] ; R7:R6 = OSTCBHighRdy->OSTCBStkPtr
MOV R7,[R8]
EXTP R7,#02h ; Get & Initialise task's context from TCB
MOV R1,[R6+#02h] ; Task CSP
MOV R2,[R6+#04h] ; Task IP
EXTP R7,#03h
MOV R3,[R6+#06h] ; Task STATUS
MOV R4,[R6+#08h] ; Task DPP1
MOV R0,[R6+#0Ah] ; 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
@RestoreContext ; Restore all processor registers from the new task's stack
RETI
_OSIntCtxSw ENDP
UCOS_C16X ENDS
;********************************************************************************************************
; HANDLE TICK ISR
; void OSTickISR (void)
;
; Description: This function is called every 10ms
;
; Arguments : none
;
; Returns : none
;
; Note(s) : The following C-like pseudo-code describe the operation being performed in the code below.
;
; Disable interrupts;
; Save all registers on the current task's stack;
; OSIntEnter();
; OSTimeTick(); Notify uC/OS-II that a tick has occured
; Clear RTC or Timer Interrupt Response Bit
; OSIntExit(); Notify uC/OS-II about end of ISR
; Restore all registers that were save on the current task's stack;
; Enable interrupts;
; Return from Interrupt;
;********************************************************************************************************
UCOS_C16X SECTION CODE
_OSTickISR PROC TASK UCOS_OSTickISR INTNO=23h
BCLR IEN ; Disable interrupts
@SaveContext ; Save current task's context
MOV R9,#SOF _ADDR03 ; call OSIntEnter();
MOV [-R0],R9
MOV R9,#SEG _ADDR03
MOV [-R0],R9
JMPS SEG (_OSIntEnter), SOF(_OSIntEnter)
_ADDR03: MOV R9,#SOF _ADDR04 ; call OSTimeTick();
MOV [-R0],R9
MOV R9,#SEG _ADDR04
MOV [-R0],R9
JMPS SEG (_OSTimeTick), SOF(_OSTimeTick)
_ADDR04: EXTR #1
MOV R9,#SOF _ADDR05 ; call OSIntExit();
MOV [-R0],R9
MOV R9,#SEG _ADDR05
MOV [-R0],R9
JMPS SEG (_OSIntExit), SOF(_OSIntExit)
_ADDR05: @RestoreContext ; Restore new task's context
BSET IEN ; Enable interrupts
RETI ; Return to interrupted task
_OSTickISR ENDP
UCOS_C16X ENDS
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -