Files
mkrtos-real/mkrtos_knl/arch/armv7m/sche.S

93 lines
1.7 KiB
ArmAsm
Raw Normal View History

2023-08-20 20:52:23 +08:00
.syntax unified
@ .cpu cortex-m3
2023-08-20 20:52:23 +08:00
.thumb
2023-08-26 23:12:31 +08:00
.global mpu_switch_to
.global sched_reset
2023-08-20 20:52:23 +08:00
.global PendSV_Handler
.type PendSV_Handler, %function
PendSV_Handler:
CPSID I
// pspmsp
MRS R0,PSP
MRS R1,MSP
// r4-r11
TST LR,#4
ITE EQ
2023-08-20 20:52:23 +08:00
MRSEQ r3, MSP
MRSNE r3, PSP
mov r2, lr
2023-08-20 20:52:23 +08:00
push {r4}
ldr r4, =sched_reset
ldr r4, [r4]
2023-08-20 20:52:23 +08:00
//! psp
CBZ r4, thread_sche
pop {r4}
2023-08-20 20:52:23 +08:00
SUB R3, R3, #0x20 //R3 -= 32
STM R3, {R4-R11}
//
TST LR,#4
2023-08-27 21:25:09 +08:00
ITTEE EQ
2023-08-20 20:52:23 +08:00
MSREQ MSP, r3
2023-08-27 21:25:09 +08:00
MOVEQ r1,r3
2023-08-20 20:52:23 +08:00
MSRNE PSP, r3
2023-08-27 21:25:09 +08:00
MOVNE r0,r3
b thread_sche_next
2023-08-20 20:52:23 +08:00
thread_sche:
pop {r4}
thread_sche_next:
2023-08-27 21:25:09 +08:00
// r0:psp r1:msp r2:(0msp 1 psp)
2023-08-20 20:52:23 +08:00
LDR.w r3,=schde_to
BLX r3
// r1 psp r2 msp
lDRD r1,r2,[r0]
//使r3 0msp 1ps
LDR r3,[R0,#8]
TST r3,#4 //使
2023-08-20 20:52:23 +08:00
ITE EQ
MOVEQ R0,R2
MOVNE R0,R1 //使psp
LDM r0, {R4-R11} //r4-r11
ADDS r0, r0, #0x20 //R0 += 0x20
//
MSR MSP,R2
MSR PSP,R1
//
@ CMP r3,#1
TST r3,#4 //使
IT EQ
BEQ super_mode//psp
B user_mode
2023-08-20 20:52:23 +08:00
user_mode:
//psp
MSR PSP, r0
//线
MOV R1,#1
MSR CONTROL, R1
//lr 21PSP
MOV LR,r3
2023-08-20 20:52:23 +08:00
B to_ret
super_mode: //msp
MSR MSP,R0
MOV LR,r3
2023-08-20 20:52:23 +08:00
//线
MOV R0,#0
MSR CONTROL, R0
to_ret:
2023-08-26 23:12:31 +08:00
push {r0-r3, lr}
bl mpu_switch_to
pop {r0-r3, lr}
2023-08-27 21:25:09 +08:00
CPSIE I
DSB
ISB
2023-08-20 20:52:23 +08:00
BX LR