📄 os_cpu_a.s
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* File : OS_CPU_A.S
* By : Jean J. Labrosse
*********************************************************************************************************
*/
#include <asm.h>
#include <stackframe.h>
/* ********************************************************************* */
/* File local definitions */
.set noat
.set noreorder
# pop task's at, v0-v1,a0-a3,t0-t9,s0-s7,fp,ra, & pc
#define RESTORE_REG_RET() \
.set noat; \
.set noreorder; \
lw ra,0(sp); \
lw fp,4(sp); \
lw gp,8(sp); \
lw t9,12(sp); \
lw t8,16(sp); \
lw s7,20(sp); \
lw s6,24(sp); \
lw s5,28(sp); \
lw s4,32(sp); \
lw s3,36(sp); \
lw s2,40(sp); \
lw s1,44(sp); \
lw s0,48(sp); \
lw t7,52(sp); \
lw t6,56(sp); \
lw t5,60(sp); \
lw t4,64(sp); \
lw t3,68(sp); \
lw t2,72(sp); \
lw t1,76(sp); \
lw t0,80(sp); \
lw a3,84(sp); \
lw a2,88(sp); \
lw a1,92(sp); \
lw a0,96(sp); \
lw v1,100(sp); \
lw v0,104(sp); \
lw AT,108(sp); \
lw k0,112(sp); \
MTC0 k0,CP0_STATUS; \
lw k0,116(sp); \
addu sp,120; \
jr k0; \
nop; \
.set at
# pop task's at, v0-v1,a0-a3,t0-t9,s0-s7,fp,ra, & pc
#define RESTORE_REG_ERET() \
.set noat; \
.set noreorder; \
lw ra,0(sp); \
lw fp,4(sp); \
lw gp,8(sp); \
lw t9,12(sp); \
lw t8,16(sp); \
lw s7,20(sp); \
lw s6,24(sp); \
lw s5,28(sp); \
lw s4,32(sp); \
lw s3,36(sp); \
lw s2,40(sp); \
lw s1,44(sp); \
lw s0,48(sp); \
lw t7,52(sp); \
lw t6,56(sp); \
lw t5,60(sp); \
lw t4,64(sp); \
lw t3,68(sp); \
lw t2,72(sp); \
lw t1,76(sp); \
lw t0,80(sp); \
lw a3,84(sp); \
lw a2,88(sp); \
lw a1,92(sp); \
lw a0,96(sp); \
lw v1,100(sp); \
lw v0,104(sp); \
lw AT,108(sp); \
lw k0,112(sp); \
mtc0 k0,CP0_STATUS; \
lw k0,116(sp); \
mtc0 k0,CP0_EPC; \
addu sp,120; \
eret; \
nop; \
.set at
# push task's at, v0-v1,a0-a3,t0-t9,s0-s7,fp,ra, & pc
#define STORE_REG_RET(Retaddr) \
.set noat; \
.set noreorder; \
subu sp,120; \
sw ra,0(sp); \
sw fp,4(sp); \
sw gp,8(sp); \
sw t9,12(sp); \
sw t8,16(sp); \
sw s7,20(sp); \
sw s6,24(sp); \
sw s5,28(sp); \
sw s4,32(sp); \
sw s3,36(sp); \
sw s2,40(sp); \
sw s1,44(sp); \
sw s0,48(sp); \
sw t7,52(sp); \
sw t6,56(sp); \
sw t5,60(sp); \
sw t4,64(sp); \
sw t3,68(sp); \
sw t2,72(sp); \
sw t1,76(sp); \
sw t0,80(sp); \
sw a3,84(sp); \
sw a2,88(sp); \
sw a1,92(sp); \
sw a0,96(sp); \
sw v1,100(sp); \
sw v0,104(sp); \
sw AT,108(sp); \
MFC0(t0,CP0_STATUS); \
sw t0,112(sp); \
sw Retaddr,116(sp); \
.set at
/*
**********************************************************************************************************
* START MULTITASKING
**********************************************************************************************************
*/
LEAF(OSStartHighRdy)
jal OSTaskSwHook /* Call user defined task switch hook */
nop
la t0,OSRunning /* Indicate that multitasking has started */
li t1,1
sb t1,0(t0) /* OSRunning is a boolean OSRunning = TRUE*/
li a0,0x31 #'1' /* a0=0x32 */
bal WriteDebugByte
nop
la t0,OSTCBHighRdy /* Get highest priority task TCB address */
lw t0,0(t0) /* get stack pointer */
lw sp,0(t0) /* switch to the new stack */
li a0,0x32 #'2' /* a0=0x32 */
bal WriteDebugByte
nop
RESTORE_REG_RET() /* pop new task's at, v0-v1,a0-a3,t0-t9,s0-s7,fp,ra, & pc */
# RESTORE_SOME
# RESTORE_AT
# RESTORE_TEMP
# RESTORE_STATIC
.end
/*
**********************************************************************************************************
* PERFORM A CONTEXT SWITCH (From task level)
**********************************************************************************************************
*/
LEAF(OSCtxSw)
/* Special optimised code below: */
STORE_REG_RET(ra) /* push task's at, v0-v1,a0-a3,t0-t9,s0-s7,fp,ra, & pc */
/* OSPrioCur = OSPrioHighRdy */
la s0,OSPrioCur
la s1,OSPrioHighRdy
lb s2,0(s1)
sb s2,0(s0)
/* Get current task TCB address */
la s0,OSTCBCur
lw s1,0(s0)
sw sp,0(s1) /* store sp in preempted tasks's TCB */
jal OSTaskSwHook /* call Task Switch Hook */
nop
/* Get highest priority task TCB address */
la s1,OSTCBHighRdy
lw s1,0(s1)
lw sp,0(s1) /* get new task's stack pointer */
/* OSTCBCur = OSTCBHighRdy */
sw s1,0(s0) /* set new current task TCB address */
/* TBI */
RESTORE_REG_ERET() /* pop new task's at, v0-v1,a0-a3,t0-t9,s0-s7,fp,ra, & pc */
.end
/*
**********************************************************************************************************
* PERFORM A CONTEXT SWITCH (From an ISR)
**********************************************************************************************************
*/
LEAF(OSIntCtxSw)
/* OSIntCtxSwFlag = True */
li t9,1
.end
/*
**********************************************************************************************************
* SOC_INTHandler
*
* This handles all the INTs
*
**********************************************************************************************************
*/
BSS
/* 32 bit align */
ALIGN(2)
.globl exc_stack_low
exc_stack_low:
.space _EXC_STKSIZE
.globl exc_stack_hi
exc_stack_hi:
ALIGN(4) /* 16 bytes align */
exc_context:
.space 8
LEAF(SOC_INTHandler)
mfc0 k0,CP0_EPC
STORE_REG_RET(k0)
la k1, exc_context
mfc0 t0,CP0_STATUS
sw t0,0(k1)
mfc0 t0,CP0_CAUSE
sw t0,4(k1)
move k0,sp
/* call low level exception handler */
/* Set up sp and gp to YAMON value */
la gp, _gp
la sp,exc_stack_hi
jal OSIntEnter /* It is imperative that k1 survives */
nop
mfc0 a0, CP0_CAUSE
nop
nop
jal Check_Exception
nop
jal OSTimeTick
nop
jal OSIntExit
nop
# li t0,OSIntCtxSwFlag
# lw t1,0(t0)
li t9,1
beq t9,1,_IntCtxSw
nop
move sp,k0
RESTORE_REG_ERET()
_IntCtxSw:
li t9,0
/* OSPrioCur = OSPrioHighRdy */
la t0,OSPrioCur
la t1,OSPrioHighRdy
lb t1,0(t1)
sb t1,0(t0)
/* Get current task TCB address */
la t0,OSTCBCur
lw t1,0(t0)
sw k0,0(t1) /* store sp in preempted tasks's TCB */
jal OSTaskSwHook /* call Task Switch Hook */
nop
/* Get highest priority task TCB address */
la t2,OSTCBHighRdy
lw t2,0(t2)
lw sp,0(t2) /* get new task's stack pointer
/* OSTCBCur = OSTCBHighRdy */
sw t2,0(t0) /* set new current task TCB address */
RESTORE_REG_ERET()
nop
.end
/*
**********************************************************************************************************
* CRITICAL SECTION METHOD 3 FUNCTIONS
*********************************************************************************************
*/
LEAF(SOCDisableInt)
MFC0(v0,CP0_STATUS)
and v1,v0,0xfffffffe /* set IE bit */
MTC0(v1,CP0_STATUS)
j ra
nop
.end
LEAF(SOCEnableInt)
MTC0(a0,CP0_STATUS)
j ra
nop
.end
/*
*********************************************************************************************
* CP0_wGetSR
*********************************************************************************************
*/
LEAF(CP0_wGetSR)
MFC0(v0,CP0_STATUS)
jr ra
nop
.end
/*
*********************************************************************************************
* CP0_GetCAUSE
*********************************************************************************************
*/
LEAF(CP0_GetCAUSE)
MFC0(v0,CP0_CAUSE)
jr ra
nop
.end
/*
*********************************************************************************************
* CP0_GetEPC
*********************************************************************************************
*/
LEAF(CP0_GetEPC)
MFC0(v0,CP0_EPC)
jr ra
nop
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -