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

📄 os_cpu_a.s

📁 PowerPC 8240 的ucosII 移植代码 开发平台为 DiabData
💻 S
字号:
#
# file: os_cpu_a.s
#
# PowerPC assembly language routines for task switching & interrupts
# for UCOS-II
#
# Author: Ernie Price
# eprice@bitwise.net
#
#########################################################################

        .global OSStartHighRdy
        .global OSCtxSw
        .global OSIntCtxSw
        .global DECIntr
        .global EIEIntr


        .text
        .align  2

        .extern OSTCBHighRdy            ;pointer to highest priority ready task
        .extern OSTCBCur                ;pointer to current task's TCB
        .extern OSTaskSwHook
        .extern OSRunning
        .extern decTimeCst
        .extern OSIntEnter
        .extern OSIntExit

#****************************************************************
#
#  match all of the following with stack frame in os_cpu_c.c
#
STK_FRM_SZ      .equ    (39 * 4)        # 32 gpr + 6 spr + sp  
XTR_REG_OFS     .equ    (33 * 4)
R0_OFFS         .equ    8
R2_OFFS         .equ    12

# Diab register usage

#r0              Scratch register.
#r1              Stack pointer.
#r2              Global pointer to the Small Constant Area (called SDA2 in EABI).
#r3 - r12        Temporary registers. Not preserved by functions. 
#r13             Global pointer to the Small Data Area (SDA) in EABI.
#r14 - r31       Preserved registers. Saved when used by functions.

SAVE_CONTEXT    macro
        stwu    r1,-STK_FRM_SZ(r1)      # create stack frame
        stw     r0,R0_OFFS(r1)          # save r0
        stmw    r2,R2_OFFS(r1)          # save regs r2 through r31
        mflr    r31                     # fetch LR
        mfxer   r30                     # fetch XER
        mfctr   r29                     # fetch CTR
        mfsrr1  r28                     # fetch MSR (from normal interrupt)
        mfsrr0  r27                     # fetch PC  (from normal interrupt)
        mfcr    r26                     # fetch CR
        stmw    r26,XTR_REG_OFS(r1)     # save regs r26 - r31
        mfmsr   r3
        ori     r3, r3, 0x10            # turn on data translation
        mtmsr   r3
        endm

RESTORE_CONTEXT macro
        lmw     r26,XTR_REG_OFS(r1)     # restore regs r26 through r31
        mtcr    r26                     # restore CR
        mtsrr0  r27                     # restore PC
        mtsrr1  r28                     # restore MSR
        mtctr   r29                     # restore CTR
        mtxer   r30                     # restore XER
        mtlr    r31                     # restore LR
        lmw     r2,R2_OFFS(r1)          # restore regs r2 through r31
        lwz     r0,R0_OFFS(r1)          # restore r0
        lwz     r1,0(r1)                # restore stack pointer
#       isync                   
        sync
        endm
#########################################################################
#       Start multitasking
#       void OSStartHighRdy(void)
#########################################################################

OSStartHighRdy:

        li      r0,1
        stb     r0,OSRunning@sdax(r13)     # Set OSRunning to 1

        b       join       


#########################################################################
#       Perform a context switch from task level
#       void OSCtxSw(void)                                      
#########################################################################

OSCtxSw:

        SAVE_CONTEXT                        # Save context - macro
                
        lwz     r11, OSTCBCur@sdax(r13)     # Get pointer to current TCB
        stw     r1,0(r11)                   # Save stack pointer in current TCB

join:
        bl      OSTaskSwHook                # Call OSTaskSwHook

        lwz     r11,OSTCBHighRdy@sdax(r13)  # Get pointer to ready task TCB
        stw     r11,OSTCBCur@sdax(r13)      # Save as current task TCB ptr.

        lbz     r10,OSPrioHighRdy@sdax(r13) # Get High Ready Priority
        stb     r10,OSPrioCur@sdax(r13)     # Save as Current Priority
                                           
        lwz     r1,0(r11)                   # Get new stack pointer

        RESTORE_CONTEXT                     # Restore context - macro     

        rfi

#########################################################################
#       Perform a context switch from an ISR
#       void OSIntCtxSw(void)                                    
#########################################################################

OSIntCtxSw:

        addi    r1,r1,0x10                  # discard function on stack (OSInitExit)

        lwz     r11, OSTCBCur@sdax(r13)     # Get pointer to current TCB
        stw     r1,0(r11)                   # Save stack pointer in current TCB

        bl      OSTaskSwHook                # Call OSTaskSwHook

        lwz     r11,OSTCBHighRdy@sdax(r13)  # Get pointer to ready task TCB
        stw     r11,OSTCBCur@sdax(r13)      # Save as current task TCB ptr.

        lbz     r10,OSPrioHighRdy@sdax(r13) # Get High Ready Priority
        stb     r10,OSPrioCur@sdax(r13)     # Save as Current Priority
                                           
        lwz     r1,0(r11)                   # Get new stack pointer

        RESTORE_CONTEXT                     # Restore context - macro     

        rfi

#########################################################################
#       Decrementer Interrupt Handler
#       void DECIntr (void)
#########################################################################

        .extern IRQLedManipulate
DECIntr:

        SAVE_CONTEXT

        lwz      r4, decTimeCst@sdax(r13)
        mfdec    r3                        # Read the decrementer
        add.     r3, r3, r4                # compute new
        mtdec    r3                        # load new timeout

        bl       OSIntEnter

        bl       OSTimeTick		   # let OS count time

        li      r3, 0x40
        bl      IRQLedManipulate

        bl       OSIntExit

        RESTORE_CONTEXT

        rfi

#########################################################################
#       External Interrupt Handler
#       void EIEIntr (void)
#########################################################################

EIEIntr:

        SAVE_CONTEXT

        bl              OSIntEnter

        bl              EIE_Hdlr        # external (or internal 8240) interrupt

        bl              OSIntExit

        RESTORE_CONTEXT

        rfi

        .end

# End of source

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -