📄 os_cpu_a.asm
字号:
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
; All Rights Reserved
;
; TI C6711 DSP Specific code
; Little Endian Mode
;
; Code Composer Studio V2.2
;
; File : OS_CPU.H
; By : Ming Zeng (ming@zming.net) 2003.11
; History : Kenneth Blake (the author of V2.00 port for C6211)
;********************************************************************************************************
;********************************************************************************************************
; PUBLIC and EXTERNAL REFERENCES
;********************************************************************************************************
FP .set A15
DP .set B14
SP .set B15
.global $bss
_StartAddress .set 0+4
_A0 .set 4 +4
_A1 .set 8 +4
_A2 .set 12 +4
_A3 .set 16 +4
_A4 .set 20 +4
_A5 .set 24 +4
_A6 .set 28 +4
_A7 .set 32 +4
_A8 .set 36 +4
_A9 .set 40 +4
_A10 .set 44 +4
_A11 .set 48 +4
_A12 .set 52 +4
_A13 .set 56 +4
_A14 .set 60 +4
_A15 .set 64 +4
_B0 .set 68 +4
_B1 .set 72 +4
_B2 .set 76 +4
_B3 .set 80 +4
_B4 .set 84 +4
_B5 .set 88 +4
_B6 .set 92 +4
_B7 .set 96 +4
_B8 .set 100 +4
_B9 .set 104 +4
_B10 .set 108 +4
_B11 .set 112 +4
_B12 .set 116 +4
_B13 .set 120 +4
_B14 .set 124 +4
_B15 .set 128 +4
_AMR .set 132 +4
_CSR .set 136 +4
_IER .set 140 +4
_IRP .set 144 +4
_Framesize .set 148 +4
.global _OSStartHighRdy
.global _OSCtxSw
.global _OSIntCtxSw
.global _Disable_int ;
.global _Enable_int ;
.global _OSTaskSwHook ; extern function & var from other objects
.global _OSTCBHighRdy
.global _OSTCBCur
.global _OSPrioCur
.global _OSPrioHighRdy
.global _OSRunning
; /*$PAGE*/
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; Note : OSStartHighRdy() MUST:
; a) Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task.
;*********************************************************************************************************
_OSStartHighRdy:
CALL _OSTaskSwHook
NOP 3
MVKL Back_Point,B3
MVKH Back_Point,B3
Back_Point: ;return here from _OSTaskSwHook
;OSRunning = TRUE
MVK 1,B1
STB B1,*+DP(_OSRunning)
; StackPointer = OSTCBHighRdy->OSTCBStkPtr
LDW *+DP(_OSTCBHighRdy),B4
nop 4
LDW *B4,SP
nop 4
;pop current task's context from stack
LDW *+SP(_StartAddress),B3 ; b3 start address
LDW *+SP(_AMR),B10 ; B10 = AMR
LDW *+SP(_CSR),B9 ; B9 = CSR
LDW *+SP(_IER),B8 ; B8 = IER
mvk 0,B13
mvc B13,IER
LDW *+SP(_A0),A0 ;
LDW *+SP(_A1),A1 ;
LDW *+SP(_A2),A2 ;
LDW *+SP(_A3),A3 ;
LDW *+SP(_A4),A4 ;
LDW *+SP(_A5),A5 ;
LDW *+SP(_A6),A6 ;
LDW *+SP(_A7),A7 ;
LDW *+SP(_A8),A8 ;
LDW *+SP(_A9),A9 ;
LDW *+SP(_A10),A10 ;
LDW *+SP(_A11),A11 ;
LDW *+SP(_A12),A12 ;
LDW *+SP(_A13),A13 ;
LDW *+SP(_A14),A14 ;
LDW *+SP(_A15),A15 ;
LDW *+SP(_B0),B0 ;
LDW *+SP(_B1),B1 ;
LDW *+SP(_B2),B2 ;
LDW *+SP(_B4),B4 ;
LDW *+SP(_B5),B5 ;
LDW *+SP(_B6),B6 ;
LDW *+SP(_B7),B7 ;
LDW *+SP(_B11),B11 ;
LDW *+SP(_B12),B12 ;
LDW *+SP(_B13),B13 ;
LDW *+SP(_B14),B14 ;
or 3,b9,B9 ; Set GIE
mvc B9,CSR ; set csr if IRP did not put a GIE
mvc B10,AMR ; Restore AMR
LDW *+SP(_B9),B9 ;
LDW *+SP(_B10),B10 ;
LDW *+SP(_B3),B3 ;
LDW *+SP(_B8),B8 ;
LDW *+SP(_B15),B15 ;
B b3 ;
mvc B8,IER ;
nop 5
; /*$PAGE*/
;*********************************************************************************************************
;
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
;*********************************************************************************************************
; .align 32
_OSCtxSw:
addk (-_Framesize),SP ; Push one Frame
STW B3,*+SP(_StartAddress) ; b3 start address
STW B0,*+SP(_B0) ;
|| mvc AMR,B0
STW B0,*+SP(_AMR) ;
|| mvc CSR,B0
STW B0,*+SP(_CSR) ;
|| mvc IER,B0
STW B0,*+SP(_IER) ;
|| mvc IRP,B0
STW B0,*+SP(_IRP) ;
STW A0,*+SP(_A0) ;
|| MV SP,A0 ; A0 = SP
STW A1,*+SP(_A1) ;
|| addk (_Framesize),A0 ; Correct SP for POP of TCB
STW A0,*+SP(_B15) ; Save correct SP
STW A2,*+SP(_A2) ;
STW A3,*+SP(_A3) ;
STW A4,*+SP(_A4) ;
STW A5,*+SP(_A5) ;
STW A6,*+SP(_A6) ;
STW A7,*+SP(_A7) ;
STW A8,*+SP(_A8) ;
STW A9,*+SP(_A9) ;
STW A10,*+SP(_A10) ;
STW A11,*+SP(_A11) ;
STW A12,*+SP(_A12) ;
STW A13,*+SP(_A13) ;
STW A14,*+SP(_A14) ;
STW A15,*+SP(_A15) ;
LDW *+DP(_OSTCBCur),B0 ; B0 = OSTCBCur
STW B1,*+SP(_B1) ;
STW B2,*+SP(_B2) ;
STW B3,*+SP(_B3) ; Save for cosmetical reasons
STW B4,*+SP(_B4) ;
STW B5,*+SP(_B5) ;
STW B6,*+SP(_B6) ;
STW SP,*B0 ; previous OSTCBCur->OSTCBStkPtr = SP ;
STW B7 ,*+SP(_B7 ) ;
STW B8 ,*+SP(_B8 ) ;
STW B9 ,*+SP(_B9 ) ;
STW B10,*+SP(_B10) ;
STW B11,*+SP(_B11) ;
STW B12,*+SP(_B12) ;
STW B13,*+SP(_B13) ;
STW B14,*+SP(_B14) ;
; /*$PAGE*/
OSIntCtxSw_Here_Start: ; form here, the same with _OSIntCtxSw
CALL _OSTaskSwHook ; invoke the OSTaskSwHook function
NOP 3
MVKL Back_Point_2,B3
MVKH Back_Point_2,B3
Back_Point_2: ; return here from _OSTaskSwHook
; OSTCBCur = OSTCBHighRdy
; OSPrioCur = OSPrioHighRdy
LDW *+DP(_OSTCBHighRdy),B4
LDB *+DP(_OSPrioHighRdy),B5
NOP 3
STW B4,*+DP(_OSTCBCur)
STB B5,*+DP(_OSPrioCur)
; StackPointer = OSTCBHighRdy->OSTCBStkPtr
LDW *B4,SP
nop 4
;pop current task's context from stack
LDW *+SP(_StartAddress),B3 ; b3 start address
LDW *+SP(_IRP),B11 ; B10 = AMR
LDW *+SP(_AMR),B10 ; B10 = AMR
LDW *+SP(_CSR),B9 ; B9 = CSR
; LDW *+SP(_IER),B8 ; B8 = IER
mvc IER,B8 ; do not change IER when switch tasks
mvk 0,B13
mvc B13,IER
LDW *+SP(_A0),A0 ;
LDW *+SP(_A1),A1 ;
LDW *+SP(_A2),A2 ;
LDW *+SP(_A3),A3 ;
LDW *+SP(_A4),A4 ;
LDW *+SP(_A5),A5 ;
LDW *+SP(_A6),A6 ;
LDW *+SP(_A7),A7 ;
LDW *+SP(_A8),A8 ;
LDW *+SP(_A9),A9 ;
LDW *+SP(_A10),A10 ;
LDW *+SP(_A11),A11 ;
LDW *+SP(_A12),A12 ;
LDW *+SP(_A13),A13 ;
LDW *+SP(_A14),A14 ;
LDW *+SP(_A15),A15 ;
LDW *+SP(_B0),B0 ;
LDW *+SP(_B1),B1 ;
LDW *+SP(_B2),B2 ;
LDW *+SP(_B4),B4 ;
LDW *+SP(_B5),B5 ;
LDW *+SP(_B6),B6 ;
LDW *+SP(_B7),B7 ;
LDW *+SP(_B12),B12 ;
LDW *+SP(_B13),B13 ;
LDW *+SP(_B14),B14 ;
or 3,b9,B9 ; Set GIE
mvc B9,CSR ; set csr if IRP did not put a GIE
mvc B10,AMR ; Restore AMR
mvc B11,IRP ; Restore AMR
LDW *+SP(_B9),B9 ;
LDW *+SP(_B10),B10 ;
LDW *+SP(_B11),B11 ;
LDW *+SP(_B3),B3 ;
LDW *+SP(_B8),B8 ;
LDW *+SP(_B15),B15 ;
B b3 ;
mvc B8,IER ;
nop 5
; /*$PAGE*/
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
;
; 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
;
; 3) The stack frame of the task to resume
;
;*********************************************************************************************************
_OSIntCtxSw:
B OSIntCtxSw_Here_Start
NOP 5
; /*$PAGE*/
;******************************************************************************
;* FUNCTION NAME: _Disable_int *
;* *
;* Notes: function for disable interrupt *
;******************************************************************************
;.align 32
_Disable_int: ;
mvc CSR,B4
and 1,B4,B0
[!B0] CLR B4,1,1,B4
[B0] SET B4,1,1,B4
CLR B4,0,0,B4
mvc B4,CSR
B B3
NOP 5
; /*$PAGE*/
;******************************************************************************
;* FUNCTION NAME: _Enable_int: *
;* *
;* Notes: function for enable interrupt *
;******************************************************************************
;.align 32
_Enable_int: ;
mvc CSR,B4
and 2,B4,B0
[!B0] CLR B4,0,0,B4
[B0] SET B4,0,0,B4
mvc B4,CSR
B B3
NOP 5
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -