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

📄 os_cpu_a.asm

📁 适用于MPC555的uCOS接口程序
💻 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 + -