📄 os_cpu_a.s
字号:
AREA OS_CPU_A,CODE,READONLY
IMPORT OSTaskSwHook
IMPORT OSIntEnter
IMPORT OSTimeTick
IMPORT OSIntExit
IMPORT Int1
IMPORT Int2
IMPORT OSTCBCur
addr_OSTCBCur DCD OSTCBCur
IMPORT OSTCBHighRdy
addr_OSTCBHighRdy DCD OSTCBHighRdy
IMPORT OSRunning
addr_OSRunning DCD OSRunning
IMPORT OSPrioHighRdy
addr_OSPrioHighRdy DCD OSPrioHighRdy
IMPORT OSPrioCur
addr_OSPrioCur DCD OSPrioCur
IMPORT OSIntNesting
addr_OSIntNesting DCD OSIntNesting
IMPORT Sw_Need
addr_Sw_Need DCD Sw_Need
IMPORT NOINT
addr_NOINT DCD NOINT ;任务中断开关标志 为0时开中断 否则关中断
SAVED_LR DCD 0
BIT_TIMER5 EQU (0x1<<8)
I_ISPC EQU 0x1e00024
NoInt EQU 0x80
SVC_MODE EQU 0x13
EXPORT OSStartHighRdy
OSStartHighRdy
BL OSTaskSwHook
MOV R0,#1
LDR R1,addr_OSRunning
STRB R0,[R1]
LDR R0,addr_OSTCBCur
LDR R0,[R0]
LDR SP,[R0]
RETURN
LDMFD SP!,{R0}
LDR R1,addr_NOINT
STR R0,[R1]
CMP R0,#0
BLNE OS_ENTER_CRITICAL
LDMFD SP!,{R0,R1}
MSR CPSR_cxsf,R0
MSR SPSR_cxsf,R1
LDMFD SP!,{R0-R12,LR,PC}
EXPORT OSCtxSw
OSCtxSw
STMFD SP!,{LR}
STMFD SP!,{LR}
STMFD SP!,{R0-R12}
MRS R0,SPSR
STMFD SP!,{R0}
MRS R0,CPSR
STMFD SP!,{R0}
LDR R0,addr_NOINT
LDR R0,[R0]
STMFD SP!,{R0}
LDR R0,addr_OSTCBCur
LDR R0,[R0]
STR SP,[R0]
BL OSTaskSwHook
LDR R0,addr_OSTCBCur
LDR R1,addr_OSTCBHighRdy
LDR R1,[R1]
STR R1,[R0]
LDR SP,[R1]
LDR R0,addr_OSPrioHighRdy
LDR R1,addr_OSPrioCur
LDRB R2,[R0]
STRB R2,[R1]
B RETURN
IntCtxSw
MOV R1,#0 ;clear the Sw_Need flag
STR R1,[R0]
LDMFD SP!,{R0-R12,LR}
STR LR, SAVED_LR
MRS LR,#SVC_MODE ;Change to task_mode
MSR CPSR_cxsf,LR
LDR LR,SAVED_LR
B OSCtxSw
EXPORT __OSTickISR
__OSTickISR
SUB LR,LR,#4
STMFD SP!,{R0-R12,LR}
MRS R0, CPSR
ORR R0, R0, #NoInt
MSR CPSR_c, R0
LDR R0, =I_ISPC ;Clear the flag
LDR R1, =BIT_TIMER5
STR R1, [r0]
BL OSIntEnter
BL OSTimeTick
BL OSIntExit
BL Int1 ;Debug message display 4
LDR R0,addr_Sw_Need
LDR R1,[R0]
CMP R1,#1
LDREQ PC,=IntCtxSw
BL Int2 ;Debug message display 5
LDMFD SP!,{R0-R12,PC}^
EXPORT OS_ENTER_CRITICAL
OS_ENTER_CRITICAL
STMFD SP!,{R0-R1}
MRS R0, CPSR
ORR R0, R0, #NoInt
MSR CPSR_c, R0
LDR R0,addr_NOINT
MOV R1,R0
LDR R0,[R0]
ADD R0,R0,#1
STR R0,[R1]
LDMFD SP!,{R0,R1}
MOV PC, LR
EXPORT OS_EXIT_CRITICAL
OS_EXIT_CRITICAL
STMFD SP!,{R0-R1}
LDR R0,addr_NOINT
MOV R1,R0
LDR R0,[R0]
SUB R0,R0,#1
STR R0,[R1]
CMP R0,#0
MRSEQ R0, CPSR
BICEQ R0, R0, #NoInt
MSREQ CPSR_c, R0
LDMFD SP!,{R0-R1}
MOV PC, LR
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -