📄 bseppca.s
字号:
#
# bseppca.s
#
# Barnett Systems Engineering
# MPC8xx PowerPC Specific Assembly Language Functions
# for UCOS-II
# Has only been checked with MPC8xx chips
# but should work with any 32-bit non-floating point PowerPC
#
# Functions:
# void OSStartHighRdy (void)
# void OSCtxSw (void)
# void OSIntCtxSw (void)
# void DECIntr (void)
#
# Author: Harry E. Barnett 11/11/99
# harryb@hbbse.com http://www.hbbse.com
#
# Version V1.00
#
#########################################################################
.list
.file "bseppca.s"
.title "UCOS-II MPC8xx Power PC Assembly Language Functions"
.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 tasks TCB
.extern OSTaskSwHook
.extern OSRunning
#########################################################################
# Stack Frame Definition
# These Stack frame definitions have to be congruent with the
# Stack Frame usage in bseppcc.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
#########################################################################
# Start multitasking
# void OSStartHighRdy(void)
#########################################################################
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
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,XLR(r1)
mtspr LR,r0
lwz r0,XCR(r1)
mtcrf 255,r0
lwz r0,XXER(r1)
mtspr XER,r0
lwz r0,XCTR(r1)
mtspr CTR,r0
lwz r0,XSRR1(r1)
mtspr SRR1,r0
lwz r0,XSRR0(r1)
mtspr SRR0,r0
lwz r0,XR0(r1)
addi r1,r1,STACK_FRAME_SIZE
rfi
#########################################################################
# Perform a context switch from task level
# void OSCtxSw(void)
#########################################################################
OSCtxSw:
#Save context
stwu r1,-STACK_FRAME_SIZE(r1)
stw r0,XR0(r1)
mfmsr r0
stw r0,XMSR(1)
mfspr r0,SRR0
stw r0,XSRR0(r1)
mfspr r0,SRR1
stw r0,XSRR1(r1)
mfspr r0,CTR
stw r0,XCTR(r1)
mfspr r0,XER
stw r0,XXER(r1)
mfcr r0
stw r0,XCR(r1)
mfspr r0,LR
stw r0,XLR(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)
# 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
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,XLR(r1)
mtspr LR,r0
lwz r0,XCR(r1)
mtcrf 255,r0
lwz r0,XXER(r1)
mtspr XER,r0
lwz r0,XCTR(r1)
mtspr CTR,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
#########################################################################
# Perform a context switch from an ISR
# void OSIntCtxSw(void)
#########################################################################
OSIntCtxSw:
# Ignore calls to OSIntExit, OSIntCtxSw
addi r1,r1,0x10
# 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
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 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,XLR(r1)
mtspr LR,r0
lwz r0,XCR(r1)
mtcrf 255,r0
lwz r0,XXER(r1)
mtspr XER,r0
lwz r0,XCTR(r1)
mtspr CTR,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
#########################################################################
# Decrementer Interrupt Handler
# void DECIntr (void)
#########################################################################
DECIntr:
#Save context
stwu r1,-STACK_FRAME_SIZE(r1)
stw r0,XR0(r1)
mfspr r0,LR
stw r0,XLR(r1)
mfcr r0
stw r0,XCR(r1)
mfspr r0,XER
stw r0,XXER(r1)
mfspr r0,CTR
stw r0,XCTR(r1)
mfspr r0,SRR1
stw r0,XSRR1(r1)
mfspr r0,SRR0
stw r0,XSRR0(r1)
mfmsr r0
stw r0,XMSR(1)
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)
bl DEC_Hdlr
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,XLR(r1)
mtspr LR,r0
lwz r0,XCR(r1)
mtcrf 255,r0
lwz r0,XXER(r1)
mtspr XER,r0
lwz r0,XCTR(r1)
mtspr CTR,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
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -