📄 os_cpu_a.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 + -