📄 os_cpu_a.asm
字号:
#########################################################################################################
# uC/OS-II
# The Real-Time Kernel
#
# (c) Copyright 1999, Jean J. Labrosse, Weston, FL
# All Rights Reserved
#
#
# PPC555 Specific code
# CodeWarrior V6.5
#
# File : OS_CPU_A.ASM
# By : Liuyuan, Tianshuo
# e-mail : kinglad@tsinghua.org.cn; tianshuo99@mails.tsinghua.edu.cn
#########################################################################################################
.extern DEC_Hdlr, external_interrupt
.extern OSTaskSwHook
.extern OSTCBCur ;pointer to current tasks TCB
.extern OSTCBHighRdy ;pointer to highest priority ready task
.extern OSPrioHighRdy
.extern OSPrioCur
.extern OSRunning
#########################################################################
# Stack Frame Definition
# This Stack frame definitions have to be congruent with the
# Stack Frame usage in OS_CPU_C.c
#########################################################################
XR1 .equ 0
XBLK .equ XR1+4
XR0 .equ XBLK+4
XSRR0 .equ XR0+4
XSRR1 .equ XSRR0+4
XCTR .equ XSRR1+4
XXER .equ XCTR+4
XCR .equ XXER+4
XLR .equ XCR+4
XR2 .equ XLR+4
XR3 .equ XR2+4
XR4 .equ XR3+4
XR5 .equ XR4+4
XR6 .equ XR5+4
XR7 .equ XR6+4
XR8 .equ XR7+4
XR9 .equ XR8+4
XR10 .equ XR9+4
XR11 .equ XR10+4
XR12 .equ XR11+4
XR13 .equ XR12+4
XR14 .equ XR13+4
XR15 .equ XR14+4
XR16 .equ XR15+4
XR17 .equ XR16+4
XR18 .equ XR17+4
XR19 .equ XR18+4
XR20 .equ XR19+4
XR21 .equ XR20+4
XR22 .equ XR21+4
XR23 .equ XR22+4
XR24 .equ XR23+4
XR25 .equ XR24+4
XR26 .equ XR25+4
XR27 .equ XR26+4
XR28 .equ XR27+4
XR29 .equ XR28+4
XR30 .equ XR29+4
XR31 .equ XR30+4
XMSR .equ XR31+4
STACK_FRAME_SIZE .equ XMSR+4
##############################################################################
#
# IntPrologue
# THIS Stack frame definitions have to be congruent with the
# Stack Frame usage in OS_CPU_C.c
#
##############################################################################
IntPrologue: .macro
#Save context
stwu r1,-STACK_FRAME_SIZE(r1)
stw r0,XR0(r1)
mfmsr r0
stw r0,XMSR(r1)
mfspr r0,SRR0
stw r0,XSRR0(r1)
mfspr r0,SRR1
stw r0,XSRR1(r1)
mflr r0
stw r0,XLR(r1)
mfctr r0
stw r0,XCTR(r1)
mfxer r0
stw r0,XXER(r1)
mfcr r0
stw r0,XCR(r1)
stw r2,XR2(r1)
stw r3,XR3(r1)
stw r4,XR4(r1)
stw r5,XR5(r1)
stw r6,XR6(r1)
stw r7,XR7(r1)
stw r8,XR8(r1)
stw r9,XR9(r1)
stw r10,XR10(r1)
stw r11,XR11(r1)
stw r12,XR12(r1)
stw r13,XR13(r1)
stw r14,XR14(r1)
stw r15,XR15(r1)
stw r16,XR16(r1)
stw r17,XR17(r1)
stw r18,XR18(r1)
stw r19,XR19(r1)
stw r20,XR20(r1)
stw r21,XR21(r1)
stw r22,XR22(r1)
stw r23,XR23(r1)
stw r24,XR24(r1)
stw r25,XR25(r1)
stw r26,XR26(r1)
stw r27,XR27(r1)
stw r28,XR28(r1)
stw r29,XR29(r1)
stw r30,XR30(r1)
stw r31,XR31(r1)
.endm
##############################################################################
#
# IntEpilogue
# THIS Stack frame definitions have to be congruent with the
# Stack Frame usage in OS_CPU_C.c
#
##############################################################################
IntEpilogue: .macro
mtspr EID,r0
lwz r2,XR2(r1)
lwz r3,XR3(r1)
lwz r4,XR4(r1)
lwz r5,XR5(r1)
lwz r6,XR6(r1)
lwz r7,XR7(r1)
lwz r8,XR8(r1)
lwz r9,XR9(r1)
lwz r10,XR10(r1)
lwz r11,XR11(r1)
lwz r12,XR12(r1)
lwz r13,XR13(r1)
lwz r14,XR14(r1)
lwz r15,XR15(r1)
lwz r16,XR16(r1)
lwz r17,XR17(r1)
lwz r18,XR18(r1)
lwz r19,XR19(r1)
lwz r20,XR20(r1)
lwz r21,XR21(r1)
lwz r22,XR22(r1)
lwz r23,XR23(r1)
lwz r24,XR24(r1)
lwz r25,XR25(r1)
lwz r26,XR26(r1)
lwz r27,XR27(r1)
lwz r28,XR28(r1)
lwz r29,XR29(r1)
lwz r30,XR30(r1)
lwz r31,XR31(r1)
lwz r0,XCR(r1)
mtcrf 0xff,r0
lwz r0,XXER(r1)
mtxer r0
lwz r0,XCTR(r1)
mtctr r0
lwz r0,XLR(r1)
mtlr r0
lwz r0,XSRR1(r1)
mtspr SRR1,r0
lwz r0,XSRR0(r1)
mtspr SRR0,r0
lwz r0,XMSR(r1)
mtmsr r0
lwz r0,XR0(r1)
addi r1,r1,STACK_FRAME_SIZE
rfi
.endm
###################################################
# Globally accessible symbols
###################################################
.global DECIntr
.global OSCtxSw
.global ExtIntr
.global OSStartHighRdy
.global OSIntCtxSw
.text
#########################################################################
# TASK LEVEL CONTEXT SWITCH
#########################################################################
OSCtxSw:
# Save context
IntPrologue
# Get pointer to current TCB
lis r11,OSTCBCur@ha
lwz r11,OSTCBCur@l(r11)
# Save stack pointer in current TCB
stw r1,0(r11)
# Call OSTaskSwHook
# bl OSTaskSwHook
# Get pointer to ready task TCB
lis r11,OSTCBHighRdy@ha
lwz r11,OSTCBHighRdy@l(r11)
# Save as current task TCB ptr.
lis r12,OSTCBCur@ha
stw r11,OSTCBCur@l(r12)
# Get High Ready Priority
lis r12,OSPrioHighRdy@ha
lbz r10,OSPrioHighRdy@l(r12)
# Save as Current Priority
lis r12,OSPrioCur@ha
stb r10,OSPrioCur@l(r12)
# Get new stack pointer
lwz r1,0(r11)
# Restore context
IntEpilogue
#########################################################################
# Decrementer Interrupt Handler
#########################################################################
DECIntr:
IntPrologue
bla DEC_Hdlr
IntEpilogue
#########################################################################
# ExternalInterrupt Interrupt Handler
#########################################################################
ExtIntr:
IntPrologue
bla external_interrupt
IntEpilogue
#########################################################################
# START HIGHEST PRIORITY TASK READY-TO-RUN
#########################################################################
OSStartHighRdy:
# Call OSTaskSwHook
bl OSTaskSwHook
# Set OSRunning to 1
li r0,1
lis r11,OSRunning@ha
stb r0,OSRunning@l(r11)
# Get pointer to ready task TCB
lis r11,OSTCBHighRdy@ha
lwz r11,OSTCBHighRdy@l(r11)
# Save as current task TCB ptr.
lis r12,OSTCBCur@ha
stw r11,OSTCBCur@l(r12)
# Get new stack pointer
lwz r1,0(r11)
# Restore context
IntEpilogue
#########################################################################
# INTERRUPT LEVEL CONTEXT SWITCH
#########################################################################
OSIntCtxSw:
# Ignore calls to OSIntExit, OSIntCtxSw
# NOTE!! The value 0x20 could be 0x10 if you are using other version
# of codewarrior compiler!
addi r1,r1,0x20
# Get pointer to current TCB
lis r11,OSTCBCur@ha
lwz r11,OSTCBCur@l(r11)
# Save stack pointer in current TCB
stw r1,0(r11)
# Call OSTaskSwHook
bl OSTaskSwHook
# Get pointer to ready task TCB
lis r11,OSTCBHighRdy@ha
lwz r11,OSTCBHighRdy@l(r11)
# Save as current task TCB ptr.
lis r12,OSTCBCur@ha
stw r11,OSTCBCur@l(r12)
# Get High Ready Priority
lis r12,OSPrioHighRdy@ha
lbz r10,OSPrioHighRdy@l(r12)
# Save as Current Priority
lis r12,OSPrioCur@ha
stb r10,OSPrioCur@l(r12)
# Get new stack pointer
lwz r1,0(r11)
# Restore context
IntEpilogue
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -