📄 os_cpu_a.s
字号:
AREA UCOS_ARM, CODE, READONLY
;void OSStartHighRdy(void)
IMPORT OSTaskSwHook
IMPORT OSRunning
IMPORT OSTCBHighRdy
EXPORT OSStartHighRdy
OSStartHighRdy
;//switch to SVC mode with IRQ & FIQ disable
msr cpsr_c,#0xD3
;//call user defined task switch hook
bl OSTaskSwHook
; OSRunning = TRUE
ldr r4,=OSRunning
mov r5,#1
strb r5,[r4]
;//get higest priority task TCB address
ldr r4,=OSTCBHighRdy
;//get stack pointer
ldr r4,[r4]
;//switch to the new stack
ldr sp,[r4]
;从新任务堆栈中恢复处理器的所有寄存器
ldmfd sp!,{r4}
msr spsr_cxsf,r4
ldmfd sp!,{r0-r12,lr,pc}^
;void OSCtxSw(void)
IMPORT OSTCBCur
IMPORT OSTaskSwHook
IMPORT OSTCBHighRdy
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
EXPORT OSCtxSw
OSCtxSw
;//save current task's context
stmfd sp!,{lr}
stmfd sp!,{r0-r12,lr}
mrs r4,cpsr
stmfd sp!,{r4}
;//OSTCBCur->OSTCBStkPtr = sp;
ldr r4,=OSTCBCur
ldr r5,[r4]
str sp,[r5]
;//OSTaskSwGook()
bl OSTaskSwHook
;//OSTCBCur = OSTCBHighRdy
ldr r6,=OSTCBHighRdy
ldr r6,[r6]
str r6,[r4]
;//OSPrioCur = OSPrioHighRdy
ldr r7,=OSPrioCur
ldr r8,=OSPrioHighRdy
ldrb r8,[r8] ;//ldr r8,[r8]
strb r8,[r7] ;//str r8,[r7] will make next instruciton to produce "Data Abort"
;//得到将来重新开始运行的任务的堆栈指针
ldr sp,[r6]
;//从新任务的任务堆栈中恢复处理器所有的寄存器的值, 执行中断返回指令
ldmfd sp!,{r4}
msr spsr_cxsf,r4
ldmfd sp!,{r0-r12,pc,lr}^
;void OSTickISR(void)
IMPORT OSIntEnter
IMPORT OSIntNesting
IMPORT OSTCBCur
IMPORT OSTimeTick
IMPORT OSIntExit
IMPORT TRACE_ARM
EXPORT OSTickISR
SRCPND EQU 0x4a000000 ;Interrupt request status
INTPND EQU 0x4a000010 ;Interrupt request status
BIT_TIMER4 EQU (0x1<<14)
OSTickISR
;//push working registers onto IRQ stack
stmfd sp!,{r1-r3}
;//save IRQ stack pointer
mov r1,sp
;//adjust IRQ stack pointer
add sp,sp,#12
;//adjust pc for return address to task
sub r2,lr,#4
;//copy spsr
mrs r3,spsr
;//change to SVC mode with IRQ & FIQ disable
msr cpsr_c,#0xD3
;//push task's return pc
stmfd sp!,{r2}
;//push task's lr
stmfd sp!,{lr}
;//push task's r12-r4
stmfd sp!,{r4-r12}
;//move task's r1-r3 from IRQ stack to SVC stack
ldmfd r1!,{r4-r6}
stmfd sp!,{r4-r6}
;//push task's r0 onto task's stack
stmfd sp!,{r0}
;//push task's cpsr (IRQ's spsr)
stmfd sp!,{r3}
;//调用OSIntEnter()或者直接给OSIntNesting加1
bl OSIntEnter
;//if(1 == OSIntNesting)
;// OSTCBCur->OSTCBStkPtr = Stack Pointer ; the "sp" is not SYS(or task) sp, it is IRQ sp
ldr r0,=OSIntNesting
ldrb r1,[r0]
cmp r1,#1
bne %F0
ldr r4,=OSTCBCur
ldr r5,[r4]
str sp,[r5]
0
;//给产生中断的设备清中断
;rSRCPND = BIT_TIMER4; //Clear pending bit
;rINTPND = BIT_TIMER4;
ldr r0,=SRCPND
ldr r1,=BIT_TIMER4
str r1,[r0]
ldr r2,=INTPND
str r1,[r2]
;重新允许中断(可选)
;OSTimeTick()
bl OSTimeTick
;OSIntExit()
bl OSIntExit
;//恢复处理器寄存器, 执行中断返回指令
ldmfd sp!,{r4}
msr spsr_cxsf,r4
ldmfd sp!,{r0-r12,lr,pc}^
;void OSIntCtxSw(void)
IMPORT OSTCBCur
IMPORT OSTaskSwHook
IMPORT OSTCBHighRdy
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
EXPORT OSIntCtxSw
OSIntCtxSw
;//OSTaskSwGook()
bl OSTaskSwHook
;//OSTCBCur = OSTCBHighRdy
ldr r4,=OSTCBCur
ldr r6,=OSTCBHighRdy
ldr r6,[r6]
str r6,[r4]
;//OSPrioCur = OSPrioHighRdy
ldr r7,=OSPrioCur
ldr r8,=OSPrioHighRdy
ldrb r8,[r8] ;//ldr r8,[r8]
strb r8,[r7] ;//str r8,[r7] will make next instruciton to produce "Data Abort"
;//sp = OSTCBHighRdy->OSTCBStkPtr
ldr sp,[r6]
;//从新任务的任务堆栈中恢复处理器所有的寄存器的值
ldmfd sp!,{r4}
msr spsr_cxsf,r4
ldmfd sp!,{r0-r12,lr,pc}
EXPORT OSCPUSaveSR
OSCPUSaveSR
mrs r0,cpsr
orr r1,r0,#0xc0
msr cpsr_c,r1
mov pc,lr
EXPORT OSCPURestoreSR
OSCPURestoreSR
msr cpsr_c,r0
mov pc,lr
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -