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

📄 os_cpu_a.src

📁 Renesas(Hitachi SuperH)SH7708的UCOS2源码,uC/OS-II 版本2.52.
💻 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 + -