📄 os_cpu_s.s
字号:
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
AREA OS_ASM,CODE,READONLY
CODE32
EXPORT AsmTkSw
EXPORT StartHT
EXPORT GETSP
EXPORT IRQ_ISR
IMPORT CtrTaskkSw
IMPORT OSTimer
IMPORT CToAsmSP
IMPORT SVCLR
IMPORT FIQLR
IMPORT FIQSPSR
IMPORT CallTkSwCount
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断级任务切换
IRQ_ISR
STMFD SP!,{R0-R12} ;存R0-R12
SUB LR,LR,#4
LDR R0,=FIQLR
STR LR,[R0] ;存FIQ LR
MRS R1,SPSR
LDR R0,=FIQSPSR
STR R1,[R0] ;存SPSR
BL OSTimer ;时间片处理
;;if CallTkSwCount>0 return
LDMFD SP!,{R0-R12}
MSR CPSR_cxsf,#(NOINT|SVCMODE) ;转换模式
STMFD SP!,{R0}
LDR R0,=SVCLR
STR LR,[R0] ;save SVC LR
LDR R0,=FIQLR
LDR LR,[R0]
LDMFD SP!,{R0}
STMFD SP!,{LR} ;push FIQ LR
LDR LR,=SVCLR
LDR LR,[LR] ;load SVC LR
STMFD SP!,{R0-R12,LR} ;push r0-r12,SVC LR
LDR R0,=FIQSPSR
LDR R1,[R0]
STMFD SP!,{R1} ;push FIQ spsr
LDR R1,=CToAsmSP
STR SP,[R1] ;存SP到CToAsmSP
BL CtrTaskkSw
LDR R1,=CToAsmSP ;加载新任务SP
LDR SP,[R1]
LDMFD SP!,{R0}
BIC R0,R0,#NOINT
MSR SPSR_cxsf,R0
LDMFD SP!,{R0-R12,LR,PC}^
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;用户级任务级切换
AsmTkSw
STMFD SP!,{LR}
STMFD SP!,{R0-R12,LR}
MRS R0,CPSR
STMFD SP!,{R0}
LDR R1,=CToAsmSP
STR SP,[R1] ;存SP到CToAsmSP
BL CtrTaskkSw ;任务调度
StartHT
LDR R1,=CToAsmSP ;加载新任务SP
LDR SP,[R1]
LDMFD SP!,{R0}
BIC R0,R0,#NOINT
MSR SPSR_cxsf,R0
LDMFD SP!,{R0-R12,LR,PC}^
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETSP
STMFD SP!,{R1,LR}
LDR R1,=CToAsmSP
STR SP,[R1] ;存SP到CToAsmSP
LDMFD SP!,{R1,PC}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -