📄 os_cpu_a.s
字号:
//********************************************************************************************************
// 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 + -