📄 os_cpu_a.s
字号:
IMPORT OSRunning
IMPORT OSPrioCur
IMPORT OSPrioHighRdy
IMPORT OSTCBCur
IMPORT OSTCBHighRdy
IMPORT OSIntNesting
IMPORT OSIntExit
IMPORT OSTaskSwHook
IMPORT TimeTick
EXPORT OS_CPU_SR_Save
EXPORT OS_CPU_SR_Restore
EXPORT OSStartHighRdy
EXPORT OSCtxSw
EXPORT OSIntCtxSw
EXPORT OS_CPU_IRQ_ISR
EXPORT OS_CPU_TIMETICK
NO_INT EQU 0xC0
SYS32_MODE EQU 0x1F
IRQ32_MODE EQU 0x12
FIQ32_MODE EQU 0x11
CODE32
PRESERVE8
AREA port,CODE,READONLY
OS_CPU_SR_Save
MRS R0,CPSR
ORR R1,R0,#NO_INT
MSR CPSR_c,R1
MOV PC,LR
OS_CPU_SR_Restore
MSR CPSR_c,R0
MOV PC,LR
OSStartHighRdy
MSR CPSR_cxsf, #0xDF
BL OSTaskSwHook
LDR R4, =OSRunning
MOV R5, #1
STRB R5, [R4]
LDR R4, =OSTCBHighRdy
LDR R4, [R4]
LDR SP, [R4]
LDR R4, [SP], #4
MSR CPSR_cxsf,R4
LDMFD SP!, {R0-R12,LR,PC}
OSCtxSw
STR LR, [SP, #-4]!
STMFD SP!, {R0-R12,LR}
MRS R4, CPSR
STR R4, [SP, #-4]!
LDR R4, =OSTCBCur
LDR R5, [R4]
STR SP, [R5]
BL OSTaskSwHook
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
LDR R4, =OSTCBCur
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
STR R6, [R4]
LDR SP, [R6]
LDR R4, [SP], #4
MSR CPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}
OSIntCtxSw
BL OSTaskSwHook
LDR R4,=OSPrioCur
LDR R5,=OSPrioHighRdy
LDRB R6,[R5]
STRB R6,[R4]
LDR R4,=OSTCBCur
LDR R6,=OSTCBHighRdy
LDR R6,[R6]
STR R6,[R4]
LDR SP,[R6]
LDR R4, [SP], #4
MSR CPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}
OS_CPU_IRQ_ISR
STR R3, [SP, #-4]!
STR R2, [SP, #-4]!
STR R1, [SP, #-4]!
MOV R1, SP
ADD SP, SP,#12
SUB R2, LR,#4
MRS R3, SPSR
MSR CPSR_c, #(NO_INT | SYS32_MODE)
STR R2, [SP, #-4]!
STMFD SP!, {R4-R12,LR}
LDMFD R1!, {R4-R6}
STMFD SP!, {R4-R6}
STMFD SP!, {R0,R3}
LDR R0, =OSIntNesting
LDRB R1, [R0]
ADD R1, R1,#1
STRB R1, [R0]
CMP R1, #1
BNE OS_CPU_IRQ_ISR_1
LDR R4, =OSTCBCur
LDR R5, [R4]
STR SP, [R5]
OS_CPU_IRQ_ISR_1
MSR CPSR_c, #(NO_INT | IRQ32_MODE)
BL TimeTick
MSR CPSR_c, #(NO_INT | SYS32_MODE)
BL OSIntExit
LDR R4, [SP], #4
MSR CPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}
OS_CPU_TIMETICK
STR R3, [SP, #-4]!
STR R2, [SP, #-4]!
STR R1, [SP, #-4]!
MOV R1, SP
ADD SP, SP,#12
SUB R2, LR,#4
MRS R3, SPSR
MSR CPSR_c, #(NO_INT | SYS32_MODE)
STR R2, [SP, #-4]!
STMFD SP!, {R4-R12,LR}
LDMFD R1!, {R4-R6}
STMFD SP!, {R4-R6}
STMFD SP!, {R0,R3}
LDR R0, =OSIntNesting
LDRB R1, [R0]
ADD R1, R1,#1
STRB R1, [R0]
CMP R1, #1
BNE OS_CPU_TIMETICK_1
LDR R4, =OSTCBCur
LDR R5, [R4]
STR SP, [R5]
OS_CPU_TIMETICK_1
MSR CPSR_c, #(NO_INT | FIQ32_MODE)
BL TimeTick
MSR CPSR_c, #(NO_INT | SYS32_MODE)
BL OSIntExit
LDR R4, [SP], #4
MSR CPSR_cxsf, R4
LDMFD SP!, {R0-R12,LR,PC}
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -