大家可以参考ST SBSFU 2.6.2的实现[Asm] 纯文本查看 复制代码 PRESERVE8
THUMB
AREA |.text|, CODE, READONLY
EXPORT SVC_Handler
SVC_Handler
IMPORT MPU_SVC_Handler
MRS r0, PSP
PUSH {LR}
BL MPU_SVC_Handler
POP {PC}
AREA |.SB_HDP_Code|, CODE, READONLY
EXPORT jump_to_function
jump_to_function
; assume R1 R2 are useless
LDR R1, [R0]
LDR R2, [R0,#4]
MOV SP, R1
BX R2
EXPORT launch_application
launch_application
; return from exception to application launch function
; R0: application vector address
; R1: exit function address
; push interrupt context R0 R1 R2 R3 R12 LR PC xPSR
;MOV R2, #0x01000000 ; xPSR activate Thumb bit
MOVS R2, #0x1
LSLS R2, R2, #24
PUSH {R2} ; FLAGS=0
MOVS R2, #1
BICS R1, R1, R2 ; clear least significant bit of exit function
PUSH {R1} ; return address = application entry point
MOVS R1, #0 ; clear other context registers
PUSH {R1} ; LR =0
PUSH {R1} ; R12 =0
PUSH {R1} ; R3 = 0
PUSH {R1} ; R2 = 0
PUSH {R1} ; R1 = 0
; set R0 to application entry point
PUSH {R0} ; R0 = application entry point
; set LR to return to thread mode with main stack
;MOV LR, #0xFFFFFFF9
MOVS R2, #6
MVNS R2, R2
MOV LR, R2
; return from interrupt
BX LR
END
C语言调用[C] 纯文本查看 复制代码 #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
/* Reset FPU context */
SCB->CPACR &= ~((3UL << 10*2)|(3UL << 11*2)); /* reset CP10 and CP11 Full Access */
FPU->FPCCR &= ~FPU_FPCCR_LSPEN_Msk; /* Disable automatic lazy state preservation for floating-point context */
FPU->FPCCR &= ~FPU_FPCCR_LSPACT_Msk; /* Clear the lazy state preservation for floating-point context */
#endif /* (__FPU_PRESENT == 1) && (__FPU_USED == 1) */
/* clear process stack & unprivileged bit */
__set_CONTROL(__get_CONTROL() & ~0x3U);
/* returns from interrupt into application */
launch_application(Address, (uint32_t)jump_to_function); |