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

📄 os_cpu_a.s

📁 uC/OS-II Notes from Nohau Corporation The code associated with this readme.txt file is provided "as
💻 S
📖 第 1 页 / 共 2 页
字号:
//********************************************************************************************************
//                                               uC/OS-II
//                                         The Real-Time Kernel
//
//                         (c) Copyright 2002, Jean J. Labrosse, Weston, FL
//                                          All Rights Reserved
//
//                                       Revised by Jorgen Andersson for
//                                          uBlaze Specific code
//                                            (Xilinx C V2.2)//
// File         : OS_CPU_A.S
// By           : Jean J. Labrosse
// Revised      : Jorgen Andersson, Nohau Corporation  (10/30/02)
// Port Version : V2.00 (for uC/OS-II V2.51 and higher)
//********************************************************************************************************
    .globl  os_cpu_a_s  
    .text
    .align  2
    .globl  os_cpu_a
    .ent    os_cpu_a_s

//********************************************************************************************************
//                                         CONFIGURATION CONSTANTS
//********************************************************************************************************

.equ OS_TICK_OC_CNTS,       1000       // 1000 Hz tick rate (assumes Free Running Timer runs at 50000 KHz)
                                       //        OS_TICK_OC_CNTS = CPU_FREQ / OS_TICKS_PER_SEC

//********************************************************************************************************
//                                           I/O PORT ADDRESSES
//********************************************************************************************************

.equ register_dump, -0x10    //Space for 2 * PC(task), Data, TCB
.equ register_dumpin, 0x0080 //Offset to restore reg

// I/O port addresses.  
.equ OS_TIMER_BASEADDR,0xFFFF8300
//********************************************************************************************************
//                                          PUBLIC DECLARATIONS
//********************************************************************************************************
   
    .globl OSStartHighRdy
    .globl OSCtxSw
    .globl OSIntCtxSw
    .globl OSTickISR
    .globl AppTickInitAsm
    .globl OS_ENTER_CRITICAL_ASM1
    .globl OS_EXIT_CRITICAL_ASM1
    .globl OS_ENTER_CRITICAL_ASM2
    .globl OS_EXIT_CRITICAL_ASM2
    .globl OS_ENTER_CRITICAL_ASM3
    .globl OS_EXIT_CRITICAL_ASM3

//********************************************************************************************************
//                                         EXTERNAL DECLARATIONS
//********************************************************************************************************

    //.globl _OSIntExit
    //.globl _OSIntNesting
    //.globl _OSPrioCur
    //.globl _OSPrioHighRdy
    //.globl _OSRunning
    //.globl _OSTaskSwHook 
    //.globl _OSTCBCur     
    //.globl _OSTCBHighRdy 
    //.globl _OSTimeTick

//********************************************************************************************************
//                               START HIGHEST PRIORITY TASK READY-TO-RUN
//
// Description : This function is called by OSStart() to start the highest priority task that was created
//               by your application before calling OSStart().
//
// Arguments   : none
//
// Note(s)     : 1) The stack frame is assumed to look as follows:
//   
//                  OSTCBHighRdy->OSTCBStkPtr,P-Data,PC,PC,Regs R0..R31,Rmsr
//
//               2) OSStartHighRdy() MUST:
//                      a) Call OSTaskSwHook() then,
//                      b) Set OSRunning to TRUE,
//                      c) Switch to the highest priority task by loading the stack pointer of the
//                         highest priority task into the SP register and execute an RTI instruction.
//********************************************************************************************************
os_cpu_a:
OSStartHighRdy:
    bralid    r15,OSTaskSwHook        // Invoke user defined context switch hook
    nop
    addi r3,r0,0x01000000             // Indicate that we are multitasking
    swi   r3,r0,OSRunning             // 

    lwi   r3,r0,OSTCBHighRdy          // Point to TCB of highest priority task ready to run
    lwi   r1,r3,0                     // Load SP into uB
//  POP 
    lwi r0,r1,register_dumpin - 0
//  lwi r1,r1,register_dumpin - 4
    lwi r2,r1,register_dumpin - 8
    lwi r3,r1,register_dumpin-12
    lwi r4,r1,register_dumpin-16
    lwi r5,r1,register_dumpin-20
    lwi r6,r1,register_dumpin-24
    lwi r7,r1,register_dumpin-28
    lwi r8,r1,register_dumpin-32
    lwi r9,r1,register_dumpin-36
    lwi r10,r1,register_dumpin-40
    lwi r11,r1,register_dumpin-44
    lwi r12,r1,register_dumpin-48
    lwi r13,r1,register_dumpin-52
    lwi r14,r1,register_dumpin-56
    lwi r15,r1,register_dumpin-60
    lwi r16,r1,register_dumpin-64
    lwi r17,r1,register_dumpin-68
    lwi r18,r1,register_dumpin-72
    lwi r19,r1,register_dumpin-76
    lwi r20,r1,register_dumpin-80
    lwi r21,r1,register_dumpin-84
    lwi r22,r1,register_dumpin-88
    lwi r23,r1,register_dumpin-92
    lwi r24,r1,register_dumpin-96
    lwi r25,r1,register_dumpin-100
    lwi r26,r1,register_dumpin-104
    lwi r27,r1,register_dumpin-108
    lwi r28,r1,register_dumpin-112
    lwi r29,r1,register_dumpin-116
    lwi r30,r1,register_dumpin-120
    lwi r31,r1,register_dumpin-128
    mts rmsr, r31
    lwi r31,r1,register_dumpin-124
//  END POP
    addi r1,r1,0x90                     // Set r1 to Top of stack
    lwi r15,r1,-8                       // Use r15 to link
    rtsd r15,0                          // Run task
    lwi r15,r1,register_dumpin-60-0x90  // Restore r15
    nop

//********************************************************************************************************
//                                       TASK LEVEL CONTEXT SWITCH
//
// Description : This function is called when a task makes a higher priority task ready-to-run.
//
// Arguments   : none
//
// Note(s)     : 1) Upon entry,
//                  OSTCBCur     points to the OS_TCB of the task to suspend
//                  OSTCBHighRdy points to the OS_TCB of the task to resume
//
//               2) The stack frame of the task to suspend looks as follows:
//                  OSTCBHighRdy->OSTCBStkPtr,P-Data,PC,PC,Regs R0..R31,Rmsr

//
//               3) The stack frame of the task to resume looks as follows:
//
//                  OSTCBHighRdy->OSTCBStkPtr
//********************************************************************************************************

OSCtxSw:
//  PUSH
    swi r0,r1,register_dump - 0 
    swi r1,r1,register_dump - 4
    swi r2,r1,register_dump - 8
    swi r3,r1,register_dump-12
    swi r4,r1,register_dump-16
    swi r5,r1,register_dump-20
    swi r6,r1,register_dump-24
    swi r7,r1,register_dump-28
    swi r8,r1,register_dump-32
    swi r9,r1,register_dump-36
    swi r10,r1,register_dump-40
    swi r11,r1,register_dump-44
    swi r12,r1,register_dump-48
    swi r13,r1,register_dump-52
    swi r14,r1,register_dump-56
    swi r15,r1,register_dump-60
    swi r16,r1,register_dump-64
    swi r17,r1,register_dump-68
    swi r18,r1,register_dump-72
    swi r19,r1,register_dump-76
    swi r20,r1,register_dump-80
    swi r21,r1,register_dump-84
    swi r22,r1,register_dump-88
    swi r23,r1,register_dump-92
    swi r24,r1,register_dump-96
    swi r25,r1,register_dump-100
    swi r26,r1,register_dump-104
    swi r27,r1,register_dump-108
    swi r28,r1,register_dump-112
    swi r29,r1,register_dump-116
    swi r30,r1,register_dump-120
    swi r31,r1,register_dump-124
    mfs r31, rmsr
    swi r31,r1,register_dump-128
//  PUSH END

    addi r3,r15,0x08
    swi r3,r1,register_dump+0x04    //Pc
    swi r3,r1,register_dump+0x08    //PC
    add r3,r0,r0
    swi r3,r1,register_dump+0x0C    //Data =0
    

    addi r3,r0,0x90
    sub r1,r1,r3                    // Set r1 to new Top of stack
    
    lwi  r3,r0,OSTCBCur             //   OSTCBCur->OSTCBStkPtr = Stack Pointer
    swi  r1,r3,0

    bralid r15,OSTaskSwHook         //   Call user task switch hook
    nop

    lwi     r3,r0,OSTCBHighRdy      //   OSTCBCur  = OSTCBHighRdy
    swi     r3,r0,OSTCBCur          //  

    lwi     r4,r0,OSPrioHighRdy     //   OSPrioCur = OSPrioHighRdy
    swi     r4,r0,OSPrioCur         //   

    lwi   r1,r3,0                   //   Load SP into uB

//  POP
    lwi r0,r1,register_dumpin - 0
//  lwi r1,r1,register_dumpin - 4
    lwi r2,r1,register_dumpin - 8
    lwi r3,r1,register_dumpin-12
    lwi r4,r1,register_dumpin-16
    lwi r5,r1,register_dumpin-20
    lwi r6,r1,register_dumpin-24
    lwi r7,r1,register_dumpin-28
    lwi r8,r1,register_dumpin-32
    lwi r9,r1,register_dumpin-36
    lwi r10,r1,register_dumpin-40
    lwi r11,r1,register_dumpin-44
    lwi r12,r1,register_dumpin-48
    lwi r13,r1,register_dumpin-52
    lwi r14,r1,register_dumpin-56
    lwi r15,r1,register_dumpin-60
    lwi r16,r1,register_dumpin-64
    lwi r17,r1,register_dumpin-68
    lwi r18,r1,register_dumpin-72
    lwi r19,r1,register_dumpin-76
    lwi r20,r1,register_dumpin-80
    lwi r21,r1,register_dumpin-84
    lwi r22,r1,register_dumpin-88
    lwi r23,r1,register_dumpin-92
    lwi r24,r1,register_dumpin-96
    lwi r25,r1,register_dumpin-100
    lwi r26,r1,register_dumpin-104
    lwi r27,r1,register_dumpin-108
    lwi r28,r1,register_dumpin-112
    lwi r29,r1,register_dumpin-116
    lwi r30,r1,register_dumpin-120
    lwi r31,r1,register_dumpin-128
    mts rmsr, r31
    lwi r31,r1,register_dumpin-124
//  END POP
    addi r1,r1,0x90                     // Set r1 to Top of stack
    lwi r15,r1,-8                       // Use r15 to link
    rtsd r15,0                          // Run task
    lwi r15,r1,register_dumpin-60-0x90  // Restore r15
    nop


//********************************************************************************************************
//                                    INTERRUPT LEVEL CONTEXT SWITCH
//
// Description : This function is called by OSIntExit() to perform a context switch to a task that has
//               been made ready-to-run by an ISR.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -