📄 os_cpu_a.s
字号:
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ @
@ uC/OS-II ARM porting source @
@ version 2.52 @
@ @
@ CyberLab 2003.11.25 @
@ www.armkorea.com @
@ by redizi @
@ @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
.text @ AREA ???, CODE, READONLY
.code 32 @ CODE32
.global OSStartHighRdy
.global OSCtxSw
.global OSIntCtxSw
.global OSTaskSwHook
.global OSRunning
.global OSTCBHighRdy
.global OSTCBCur
.global OSPrioCur
.global OSPrioHighRdy
.global OSIntNesting
.global OSTimeTick
.global OSIntExit
.equ OS_TASK_USERMODE, 0
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@-----------------------------------------------------------------------------@
@ uC/OS Porting Core Function : OSStartHighRdy @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
OSStartHighRdy :
BL OSTaskSwHook @ Call user defined task switch hook
LDR r0, =OSRunning @ Indicate that multitasking has started
MOV r1, #1
STRB r1, [r0]
LDR r0, =OSTCBHighRdy @ r0 <= &OSTCBHighRdy
LDR r0, [r0] @ r0 <= OSTCBHighRdy
@@ context restored
LDMIA r0!, {r12, r14}
MSR spsr_fsxc, r12
LDMIA r0, {r0-r14}^
NOP
MOVS pc, r14
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@-----------------------------------------------------------------------------@
@ uC/OS Porting Core Function : OSIntCtxSw @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
OSIntCtxSw:
ADD sp, fp, #4
@@ set variables
BL OSTaskSwHook @ Call user defined task switch hook
LDR r1, =OSPrioHighRdy @ r1 <= &OSPrioHighRdy
LDR r0, =OSPrioCur @ r0 <= &OSPrioCur
LDRB r3, [r1] @ r3 <= OSPrioHighRdy
STRB r3, [r0] @ OSPrioCur = OSPrioHighRdy
LDR r1, =OSTCBHighRdy @ r1 <= &OSTCBHighRdy
LDR r0, =OSTCBCur @ r0 <= &OSTCBCur
LDR r2, [r1] @ r2 <= OSTCBHighRdy
STR r2, [r0] @ OSTCBCur = OSTCBHighRdy
@@ context restored
LDMIA r2!, {r12, r14}
MSR spsr_fsxc, r12
LDMIA r2, {r0-r14}^
NOP
MOVS pc, r14
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@-----------------------------------------------------------------------------@
@ uC/OS Porting Core Function : OSCtxSw @
@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
OSCtxSw:
@@ context saved
LDR r0, =OSTCBCur @ r0 <= &OSTCBCur
LDR r0, [r0] @ r0 <= OSTCBCur
MRS r12, SPSR @ load spsr
STR r12, [r0], #8 @ save spsr
LDMFD sp!, {r2, r3} @ load r0, r1
STMIA r0!, {r2, r3} @ save r0, r1
LDMFD sp!, {r2, r3, r12, r14} @ load r2, r3, r12, r14
STR r14, [r0, #-12] @ save return address
STMIA r0, {r2-r14}^ @ save r2-r14
@@ set variables
BL OSTaskSwHook @ Call user defined task switch hook
LDR r1, =OSPrioHighRdy @ r1 <= &OSPrioHighRdy
LDR r0, =OSPrioCur @ r0 <= &OSPrioCur
LDRB r3, [r1] @ r3 <= OSPrioHighRdy
STRB r3, [r0] @ OSPrioCur = OSPrioHighRdy
LDR r1, =OSTCBHighRdy @ r1 <= &OSTCBHighRdy
LDR r0, =OSTCBCur @ r0 <= &OSTCBCur
LDR r2, [r1] @ r2 <= OSTCBHighRdy
STR r2, [r0] @ OSTCBCur = OSTCBHighRdy
@@ context restored
LDMIA r2!, {r12, r14}
MSR spsr_fsxc, r12
LDMIA r2, {r0-r14}^
NOP
MOVS pc, r14
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.global UCOS_IRQ
.global UCOS_SWI
@------------------------------------------------------------------------
@ Handler for SWI
@------------------------------------------------------------------------
UCOS_SWI:
STMFD sp!, {r0-r3,r12,lr} @ registers saved
@@ get the SWI number & prepare the argument 1
LDR r0, [lr, #-4]
BIC r0, r0, #0xff000000
@@ Context Switching
CMP r0, #0x80
BLEQ OSCtxSw
.if OS_TASK_USERMODE
.global SWI_Handler
@@ prepare the argument 2
MOV r1, sp
BL SWI_Handler
.endif
LDMFD sp!, {r0-r3,r12,pc}^ @ registers restored
@@===========================================================================
@@ for S3C2410
@@ Interrupt Control
@@===========================================================================
INTOFFSET = 0x4a000014
@------------------------------------------------------------------------
@ Handler for IRQ
@------------------------------------------------------------------------
UCOS_IRQ:
SUB r14, r14, #4
STMFD sp!, {r14} @ save return address
@@ context saved
LDR r14, =OSTCBCur @ r0 <= &OSTCBCur
LDR r14, [r14] @ r0 <= OSTCBCur
ADD r14, r14, #8 @ pointer of armReg[2]: R0
STMIA r14, {r0-r14}^ @ save r0-r14
MRS r0, SPSR
LDMFD sp!, {r1}
STMFD r14, {r0,r1}
@@ OSIntEnter()
LDR r0, =OSIntNesting @ Notify uC/OS-II of ISR
LDRB r1, [r0]
ADD r1, r1, #1
STRB r1, [r0]
@@ process ISR
LDR r0, =INTOFFSET
LDR r0, [r0]
MOV r0, r0, lsl #2
LDR r2, =IRQ_TABLE
MOV lr, pc
LDR pc, [r2, r0]
@@ OSIntExit()
BL OSIntExit @ Notify uC/OS-II of end of ISR
@@ context restored
LDR r0, =OSTCBCur @ r0 <= &OSTCBCur
LDR r0, [r0] @ r0 <= OSTCBCur
LDMIA r0!, {r12, r14}
MSR spsr_fsxc, r12
LDMIA r0, {r0-r14}^
NOP
MOVS pc, r14
@========================================================================
@========================================================================
@========================================================================
.global UCOS_DisableIRQ
.global UCOS_RestoreIRQ
@------------------------------------------------------------------------
@ Used in User Mode
.if OS_TASK_USERMODE
UCOS_DisableIRQ:
MOV r0, #0
MRS r1, spsr
TST r1, #0x80
ADDEQ r0, r0, #1
ORR r1, r1, #0x80
MSR spsr_c, r1
MOV pc,lr
UCOS_RestoreIRQ:
MRS r1, spsr
CMP r0, #0
ORREQ r1, r1, #0x80
BICNE r1, r1, #0x80
MSR spsr_c, r1
MOV pc,lr
.else
@------------------------------------------------------------------------
@ Used in System Mode
UCOS_DisableIRQ:
MOV r0, #0
MRS r1, cpsr
TST r1, #0x80
ADDEQ r0, r0, #1
ORR r1, r1, #0x80
MSR cpsr_c, r1
MOV pc,lr
UCOS_RestoreIRQ:
MRS r1, cpsr
CMP r0, #0
ORREQ r1, r1, #0x80
BICNE r1, r1, #0x80
MSR cpsr_c, r1
MOV pc,lr
.endif
@------------------------------------------------------------------------
@ void UCOS_VectSet(int num, int addr)
@ num : interrupt number
@ addr : address of the ISR
@------------------------------------------------------------------------
.global UCOS_VectSet
UCOS_VectSet:
mov r0, r0, lsl #2
ldr r2, =IRQ_TABLE
add r0, r0, r2
str r1, [r0]
mov pc, lr
@------------------------------------------------------------------------
@ void armOSCtxSw(void)
@------------------------------------------------------------------------
.global armOSCtxSw
armOSCtxSw:
stmfd sp!, {lr}
swi 0x80
ldmfd sp!, {pc}
@------------------------------------------------------------------------
@ int armOSSaveIRQ(void)
@------------------------------------------------------------------------
.global armOSSaveIRQ
armOSSaveIRQ:
stmfd sp!, {lr}
swi 2
ldmfd sp!, {pc}
@------------------------------------------------------------------------
@ void armOSRestoreIRQ(int)
@------------------------------------------------------------------------
.global armOSRestoreIRQ
armOSRestoreIRQ:
stmfd sp!, {lr}
swi 3
ldmfd sp!, {pc}
.data
IRQ_TABLE: .space 4*32
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -