MXC_A39_20240320/SW/components/modules/FreeRTOS/cpu_context.s

80 lines
1.4 KiB
ArmAsm
Raw Permalink Normal View History

2024-03-07 16:46:43 +08:00
EXPORT low_power_save_cpu
EXPORT low_power_restore_cpu
IMPORT low_power_enter_sleep
;ret
;msp
;psp
;control
;msplim
;psplim
low_power_store_size EQU 0x00000018
AREA |.bss|, NOINIT, READWRITE, ALIGN=3
low_power_store_addr
low_power_store_buffer SPACE low_power_store_size
AREA |ram_code|, CODE, READONLY, ALIGN=2
PRESERVE8
low_power_save_cpu
push {r0-r12, lr}
mrs r0, BASEPRI
mrs r1, PRIMASK
mrs r2, FAULTMASK
mrs r3, CONTROL
mrs r4, APSR
mrs r5, EPSR
mrs r6, IPSR
push {r0-r6}
ldr r1, =low_power_store_addr
mrs r2, msp
str r2, [r1]
mrs r2, psp
str r2, [r1, #4]
mrs r2, CONTROL
str r2, [r1, #8]
ldr r2, =ret
orr r2, r2, #1
str r2, [r1, #12]
mrs r2, msplim
str r2, [r1, #16]
mrs r2, psplim
str r2, [r1, #20]
bl low_power_enter_sleep
b .
ret
ldr r1, =low_power_store_addr
ldr r2, [r1]
msr msp, r2
ldr r2, [r1, #4]
msr psp, r2
ldr r2, [r1, #8]
msr CONTROL, r2
ldr r2, [r1, #16]
msr msplim, r2
ldr r2, [r1, #20]
msr psplim, r2
pop {r0-r6}
msr BASEPRI, r0
msr PRIMASK, r1
msr FAULTMASK, r2
msr CONTROL, r3
msr APSR_nzcvq, r4
msr EPSR, r5
msr IPSR, r6
pop {r0-r12, pc}
low_power_restore_cpu
ldr r1, =low_power_store_addr
ldr r1, [r1,#12]
bx r1
END