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

📄 os_cpu_a.s

📁 自己写的
💻 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 + -