📄 os_cpu_a.s
字号:
MOVE.L A1,(_OSTCBCur)
MOVE.L (A1),A7 ; Get the stack pointer of the task to resume
MOVE.B (_OSPrioHighRdy),(_OSPrioCur) ; OSPrioCur = OSPrioHighRdy
MOVEM.L (A7)+,A0-A6/D0-D7 ; Restore the CPU registers
RTE ; Run task
;********************************************************************************************************
; INTERRUPT LEVEL CONTEXT SWITCH
;
; Description : This function is provided for backward compatibility and your ISR MUST NOT call
; OSIntExit(). Instead, your ISR MUST JUMP to OSIntExit68K().
;
; Arguments : none
;
; Note(s) : 1) The stack frame upon entry:
;
; SP + 0 ----> Return PC of OSIntCtxSw() (H) Low Memory
; + 2 Return PC of OSIntCtxSw() (L)
; + 4 OS_ENTER_CRITICAL() using OS_CRITICAL_METHOD #2
; + 6 Return PC of OSIntExit() (H)
; + 8 Return PC of OSIntExit() (L)
; + 10 D0 (H)
; + 12 D0 (L)
; + 14 D1 (H)
; + 16 D1 (L)
; + 18 D2 (H)
; + 20 D2 (L)
; + 22 D3 (H)
; + 24 D3 (L)
; + 26 D4 (H)
; + 28 D4 (L)
; + 30 D5 (H)
; + 32 D5 (L)
; + 34 D6 (H)
; + 36 D6 (L)
; + 38 D7 (H)
; + 40 D7 (L)
; + 42 A0 (H)
; + 44 A0 (L)
; + 46 A1 (H)
; + 48 A1 (L)
; + 50 A2 (H)
; + 52 A2 (L)
; + 54 A3 (H)
; + 56 A3 (L)
; + 58 A4 (H)
; + 60 A4 (L)
; + 62 A5 (H)
; + 64 A5 (L)
; + 66 A6 (H)
; + 68 A6 (L)
; + 70 SR of interrupted task
; + 72 PC of task (H)
; + 74 PC of task (L)
; + 76 0x80 + 4 * TRAP# High Memory
;********************************************************************************************************
_OSIntCtxSw:
ADDA.L #10,A7 ; Adjust the stack
MOVE.L (_OSTCBCur),A1 ; Save the stack pointer in the suspended task TCB
MOVE.L A7,(A1)
JSR _OSTaskSwHook ; Invoke user defined context switch hook
MOVE.L (_OSTCBHighRdy),A1 ; OSTCBCur = OSTCBHighRdy
MOVE.L A1,(_OSTCBCur)
MOVE.L (A1),A7 ; Get the stack pointer of the task to resume
MOVE.B (_OSPrioHighRdy),(_OSPrioCur) ; OSPrioCur = OSPrioHighRdy
MOVEM.L (A7)+,A0-A6/D0-D7 ; Restore the CPU registers
RTE ; Run task
;********************************************************************************************************
; INTERRUPT EXIT FUNCTION
;
; Description : Your ISR MUST JUMP to this function when it is done.
;
; Arguments : none
;
; Note(s) : 1) Stack frame upon entry:
;
; SP + 0 ----> D0 (H) Low Memory
; + 2 D0 (L)
; + 4 D1 (H)
; + 6 D1 (L)
; + 8 D2 (H)
; + 10 D2 (L)
; + 12 D3 (H)
; + 14 D3 (L)
; + 16 D4 (H)
; + 18 D4 (L)
; + 20 D5 (H)
; + 22 D5 (L)
; + 24 D6 (H)
; + 26 D6 (L)
; + 28 D7 (H)
; + 30 D7 (L)
; + 32 A0 (H)
; + 34 A0 (L)
; + 36 A1 (H)
; + 38 A1 (L)
; + 40 A2 (H)
; + 42 A2 (L)
; + 44 A3 (H)
; + 46 A3 (L)
; + 48 A4 (H)
; + 50 A4 (L)
; + 52 A5 (H)
; + 54 A5 (L)
; + 56 A6 (H)
; + 58 A6 (L)
; + 60 Task or ISR's SR
; + 62 PC of task (H)
; + 64 PC of task (L)
; + 66 0x80 + 4 * TRAP# High Memory
;********************************************************************************************************
_OSIntExit68K:
ORI #$0700,SR ; Disable interrupts
SUBQ.B #1,_OSIntNesting ; OSIntNesting--;
BNE OSIntExit68K_Exit
MOVE.B _OSLockNesting,D0 ; if (OSLockNesting == 0) {
BNE OSIntExit68K_Exit
MOVE.W (60,A7),D0 ; if (LAST nested ISR) {
ANDI.W #$0700,D0
BNE OSIntExit68K_Exit
MOVEQ.L #0,D0 ; y = OSUnMapTbl[OSRdyGrp];
MOVE.B _OSRdyGrp,D0
MOVE.L D0,A0
MOVE.B (_OSUnMapTbl,A0),D2
MOVE.B D2,D0 ; OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
LSL.B #3,D0
MOVEQ.L #0,D1
MOVE.B D2,D1
MOVE.L D1,A0
MOVEQ.L #0,D1
MOVE.B (_OSRdyTbl,A0),D1
MOVE.L D1,A0
ADD.B (_OSUnMapTbl,A0),D0
MOVE.B D0,_OSPrioHighRdy ; if (OSPrioHighRdy != OSPrioCur) {
CMP.B _OSPrioCur,D0
BEQ OSIntExit68K_Exit
MOVEQ.L #0,D1 ; OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
MOVE.B D0,D1
LSL.L #2,D1
MOVE.L D1,A0
MOVE.L (_OSTCBPrioTbl,A0),_OSTCBHighRdy
ADDQ.L #1,_OSCtxSwCtr ; OSCtxSwCtr++;
; PERFORM INTERRUPT LEVEL CONTEXT SWITCH:
MOVE.L (_OSTCBCur),A1 ; Save the stack pointer in the suspended task TCB
MOVE.L A7,(A1)
JSR _OSTaskSwHook ; Invoke user defined context switch hook
MOVE.L (_OSTCBHighRdy),A1 ; OSTCBCur = OSTCBHighRdy
MOVE.L A1,(_OSTCBCur)
MOVE.B (_OSPrioHighRdy),(_OSPrioCur) ; OSPrioCur = OSPrioHighRdy
MOVE.L (A1),A7 ; Get the stack pointer of the task to resume
OSIntExit68K_Exit:
MOVEM.L (A7)+,A0-A6/D0-D7 ; Restore the CPU registers
RTE ; Return to task or nested ISR
;********************************************************************************************************
; SYSTEM TICK ISR
;
; Description: This function is the ISR used to notify uC/OS-II that a system tick has occurred.
;
; Arguments: none
;
; Notes: 1) You MUST increment 'OSIntNesting' and NOT call OSIntEnter()
; 2) You MUST save ALL the CPU registers as shown below
; 3) You MUST JUMP to OSIntExit68K() instead of call the function.
; 4) You MUST NOT use OSIntExit() to exit an ISR with the 68K.
;********************************************************************************************************
_OSTickISR:
ADDQ.B #1,_OSIntNesting ; OSIntNesting++;
MOVEM.L A0-A6/D0-D7,-(A7) ; Save the registers of the current task
; CLEAR the INTERRUPT source!
JSR _OSTimeTick ; Call uC/OS-II's tick updating function
JMP _OSIntExit68K ; Exit ISR through uC/OS-II
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -