📄 os_cpu_a.src
字号:
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
; All Rights Reserved
;
;
; Hitachi SH3
;
;
;
;
; File : OS_CPU_A.SRC
; By : Kuan, Yeou-Fuh
;********************************************************************************************************
.EXPORT _OSStartHighRdy
.EXPORT _OSCtxSw
.EXPORT _OSIntCtxSw
.EXPORT _disable_ints
.EXPORT _enable_ints
.IMPORT _OSTaskSwHook
.IMPORT _OSTCBHighRdy
.IMPORT _OSRunning
.IMPORT _OSTCBCur
.IMPORT _OSPrioCur
.IMPORT _OSPrioHighRdy
.IMPORT _OSIntEnter
.IMPORT _OSTimeTick
.IMPORT _OSIntExit
.SECTION P,CODE,ALIGN=4
_disable_ints:
MOV.L #h'000000F0, R1 ; Mask all interrupt
STC SR, R0
OR R1, R0
LDC R0, SR
rts
nop
_enable_ints:
MOV.L #h'FFFFFF0F, R1 ; Don't mask all interrupt
STC SR, R0
AND R1, R0
LDC R0, SR
rts
nop
_OSStartHighRdy:
mov.l #_OSTaskSwHook, r1 ; address of OSTaskSwHook function in R1
jsr @r1 ; call OSTaskSwHook()
nop
mov.l #_OSTCBHighRdy, r1 ; address of OSTCBHighRdy in R1
mov.l @r1, r2 ; r2 is now the address of the ready task
mov.l @r2, r15 ; stack pointer = OSTCBHighRdy->OSTCBStkptr
mov.l #_OSRunning, r1 ; address of OSRunning in R1
mov #1, r2 ; make OSRunning = TRUE (1)
mov.b r2, @r1
; restore all processor registers from new task's stack
mov.l @r15+, r14
mov.l @r15+, r13
mov.l @r15+, r12
mov.l @r15+, r11
mov.l @r15+, r10
mov.l @r15+, r9
mov.l @r15+, r8
mov.l @r15+, r7
mov.l @r15+, r6
mov.l @r15+, r5
mov.l @r15+, r4
mov.l @r15+, r3
mov.l @r15+, r2
mov.l @r15+, r1
mov.l @r15+, r0
lds.l @r15+, pr
ldc.l @r15+, gbr
lds.l @r15+, mach
lds.l @r15+, macl
ldc.l @r15+, spc
ldc.l @r15+, ssr
rte ; return from interrupt
nop
_OSCtxSw:
add #4, r15 ; adjust stack pointer to remove stack item push by
; GEHandler () : frame size is 4
; So total 4 bytes must be removed from stack.
; save current task's stack pointer into current task's OS_TCB
mov.l #_OSTCBCur, r0 ; get address of OSTCBCur
mov.l @r0, r1 ; R1 contains address of current TCB
mov.l r15, @r1 ; put stack pointer into it
mov.l #_OSTaskSwHook, r2
jsr @r2 ; call OSTaskSWHook
nop
mov.l #_OSTCBCur, r0 ; get address of OSTCBCur
mov.l #_OSTCBHighRdy, r1 ; get address of OSTCBHighRdy
mov.l @r1, r3
mov.l r3, @r0 ; OSTCBCur = OSTCBHighRdy
mov.l #_OSPrioCur, r0 ; get address of OSPrioCur
mov.l #_OSPrioHighRdy, r1 ; get address of OSPrioHighRdy
mov.b @r1, r3
mov.b r3, @r0
mov.l #_OSTCBHighRdy, r0 ; get address of OSTCBHighRdy
mov.l @r0, r1 ; r1 contains address of current TCB
mov.l @r1, r15 ; stack pointer = OSTCBHighRdy->OSTCBStkPtr
; restore all processor registers from new task's stack
mov.l @r15+, r14
mov.l @r15+, r13
mov.l @r15+, r12
mov.l @r15+, r11
mov.l @r15+, r10
mov.l @r15+, r9
mov.l @r15+, r8
mov.l @r15+, r7
mov.l @r15+, r6
mov.l @r15+, r5
mov.l @r15+, r4
mov.l @r15+, r3
mov.l @r15+, r2
mov.l @r15+, r1
mov.l @r15+, r0
lds.l @r15+, pr
ldc.l @r15+, gbr
lds.l @r15+, mach
lds.l @r15+, macl
ldc.l @r15+, spc
ldc.l @r15+, ssr
rte
nop
_OSIntCtxSw:
add #24, r15 ; adjust stack pointer to remove stack item push by
; INTJHandler () : frame size is 12
; ISR Routine : frame size is 4
; OSIntExit () : frame size is 4,
; So total 20 bytes must be removed from stack
; save current task's stack pointer into current task's OS_TCB
mov.l #_OSTCBCur, r0 ; get address of OSTCBCur
mov.l @r0, r1 ; R1 contains address of current TCB
mov.l r15, @r1 ; put stack pointer into it
mov.l #_OSTaskSwHook, r2
jsr @r2 ; call OSTaskSWHook
nop
mov.l #_OSTCBCur, r0 ; get address of OSTCBCur
mov.l #_OSTCBHighRdy, r1 ; get address of OSTCBHighRdy
mov.l @r1, r3
mov.l r3, @r0 ; OSTCBCur = OSTCBHighRdy
mov.l #_OSPrioCur, r0 ; get address of OSPrioCur
mov.l #_OSPrioHighRdy, r1 ; get address of OSPrioHighRdy
mov.b @r1, r3
mov.b r3, @r0
mov.l #_OSTCBHighRdy, r0 ; get address of OSTCBHighRdy
mov.l @r0, r1 ; r1 contains address of current TCB
mov.l @r1, r15 ; stack pointer = OSTCBHighRdy->OSTCBStkPtr
; restore all processor registers from new task's stack
mov.l @r15+, r14
mov.l @r15+, r13
mov.l @r15+, r12
mov.l @r15+, r11
mov.l @r15+, r10
mov.l @r15+, r9
mov.l @r15+, r8
mov.l @r15+, r7
mov.l @r15+, r6
mov.l @r15+, r5
mov.l @r15+, r4
mov.l @r15+, r3
mov.l @r15+, r2
mov.l @r15+, r1
mov.l @r15+, r0
lds.l @r15+, pr
ldc.l @r15+, gbr
lds.l @r15+, mach
lds.l @r15+, macl
ldc.l @r15+, spc
ldc.l @r15+, ssr
rte
nop
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -