📄 os_cpu_a.~s
字号:
@/*************************************************************************/
@/* */
@/* FILE VERSION */
@/* */
@/* os_cpu_a.s S3C2410X 1.00 */
@/* */
@/* Project name: EB44B0(S3C44B0X) Main board */
@/* Description : Functions defined in this module */
@/* */
@/* */
@/* void ARMDisableInt(void) --- disable interrupts when in SVC */
@/* void ARMEnableInt(void) --- enable interrupts when in SVC */
@/* void OS_TASK_SWAP(void) --- context switch */
@/* void OSStartHighRdy(void) --- start highest priority task */
@/* */
@/* AUTHOR */
@/* */
@/* cooljet */
@/* DATE: */
@/* 2003-06-07 */
@/* */
@/* HISTORY */
@/* */
@/* NAME DATE REMARKS */
@/* cooljet 2003-06-06 13:10 Modify for PBI-2 */
@/*************************************************************************/
.EQU SwiV , 0x08
.EQU IrqV , 0x18
.EQU FiqV , 0x1C
.EQU NoInt , 0x80
.EQU SVC32Mode , 0x13
.EQU IRQ32Mode , 0x12
.EQU FIQ32Mode , 0x11
.EQU OSEnterSWI , 0x00
@
@ These defines are use in the INT_IRQ processing for UART,
@ and Timer0 Interrupts
@
.EQU IRQ_TIMER1 , 12
@/*************************************************************************/
@/* External symbols we need the addresses of */
@/*************************************************************************/
.EXTERN OSTCBCur
addr_OSTCBCur :
.LONG OSTCBCur
.EXTERN OSTCBHighRdy
addr_OSTCBHighRdy :
.LONG OSTCBHighRdy
.EXTERN OSPrioCur
addr_OSPrioCur :
.LONG OSPrioCur
.EXTERN OSPrioHighRdy
addr_OSPrioHighRdy :
.LONG OSPrioHighRdy
.EXTERN need_to_swap_context
.EXTERN IrqStart
.EXTERN OSTimeTick
.EXTERN IrqFinish
.EXTERN irq_entry
.EXTERN OutDebug
.EXTERN BreakPoint
@/*************************************************************************/
@/* */
@/* FUNCTION */
@/* */
@/* TickHandler */
@/* */
@/* DESCRIPTION */
@/* */
@/* This function will be called when every tick is expired */
@/* */
@/* - Call IrqStart */
@/* - Call OSTimeTick */
@/* - Call IrqFinish */
@/* - Context switching when necessaryly */
@/* */
@/* AUTHOR */
@/* */
@/* @ */
@/* DATE: */
@/* 2003-06-05 */
@/* CALLED BY */
@/* */
@/* */
@/* CALLS */
@/* */
@/* none */
@/* */
@/* INPUTS */
@/* */
@/* None */
@/* */
@/* OUTPUTS */
@/* */
@/* None */
@/* */
@/* HISTORY */
@/* */
@/* NAME DATE REMARKS */
@/* */
@/* */
@/*************************************************************************/
@VOID TickHandler(void)
@{
.GLOBAL OSTickISR
OSTickISR :
STMDB sp!,{r0-r11,lr}
@ interrupt disable(not nessary)
mrs r0, CPSR
orr r0, r0, #0x80 @ and set IRQ disable flag
msr CPSR_cxsf, r0
@End of interrupt
@(Clear pending bit of INTPEND that don't accessed it.)
@ rI_ISPC= BIT_TIMER0;
mov r0, #IRQ_TIMER1
BL Irq_Clear
BL IrqStart
BL OSTimeTick
BL IrqFinish
LDR r0, =need_to_swap_context
LDR r2, [r0]
CMP r2, #1
LDREQ pc, =_CON_SW
_NOT_CON_SW :
@not context switching
LDMIA sp!,{r0-r11, lr}
SUBS pc, lr, #4
_CON_SW:
@set need_to_swap_context is '0'
MOV r1, #0
STR r1, [r0]
@now context switching
LDMIA sp!,{r0-r11,lr}
SUB lr, lr, #4
STR lr, SAVED_LR
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@Change Supervisor mode
@!!!r12 register don't preserved. (r12 that PC of task)
MRS lr, SPSR
AND lr, lr, #0xFFFFFFE0
ORR lr, lr, #0x13
MSR CPSR_cxsf, lr
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@Now Supervisor mode
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
STR r12, [sp, #-8] @ saved r12
LDR r12, SAVED_LR
STMFD sp!, {r12} @ r12 that PC of task
SUB sp, sp, #4 @ inclease stack point
LDMIA sp!, {r12} @ restore r12
STMFD sp!, {lr} @ save lr
STMFD sp!, {r0-r12} @ save register file and ret address
MRS r4, CPSR
STMFD sp!, {r4} @ save current PSR
MRS r4, SPSR @ YYY+
STMFD sp!, {r4} @ YYY+ save SPSR
@ OSPrioCur = OSPrioHighRdy
LDR r4, addr_OSPrioCur
LDR r5, addr_OSPrioHighRdy
LDRB r6, [r5]
STRB r6, [r4]
@ Get current task TCB address
LDR r4, addr_OSTCBCur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -