未验证 提交 a2f20dde 编写于 作者: B Bernard Xiong 提交者: GitHub

Merge pull request #1201 from aozima/cortex-m

[libcpu]: fixed #1196 FPU FPCA issue.
...@@ -145,16 +145,16 @@ switch_to_thread: ...@@ -145,16 +145,16 @@ switch_to_thread:
MSR psp, r1 /* update stack pointer */ MSR psp, r1 /* update stack pointer */
pendsv_exit:
/* restore interrupt */
MSR PRIMASK, r2
#if defined (__VFP_FP__) && !defined(__SOFTFP__) #if defined (__VFP_FP__) && !defined(__SOFTFP__)
ORR lr, lr, #0x10 /* lr |= (1 << 4), clean FPCA. */ ORR lr, lr, #0x10 /* lr |= (1 << 4), clean FPCA. */
CMP r3, #0 /* if(flag_r3 != 0) */ CMP r3, #0 /* if(flag_r3 != 0) */
BICNE lr, lr, #0x10 /* lr &= ~(1 << 4), set FPCA. */ BICNE lr, lr, #0x10 /* lr &= ~(1 << 4), set FPCA. */
#endif #endif
pendsv_exit:
/* restore interrupt */
MSR PRIMASK, r2
ORR lr, lr, #0x04 ORR lr, lr, #0x04
BX lr BX lr
......
...@@ -149,10 +149,6 @@ skip_pop_fpu ...@@ -149,10 +149,6 @@ skip_pop_fpu
MSR psp, r1 ; update stack pointer MSR psp, r1 ; update stack pointer
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
#if defined ( __ARMVFP__ ) #if defined ( __ARMVFP__ )
ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA. ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA.
CBZ r3, return_without_fpu ; if(flag_r3 != 0) CBZ r3, return_without_fpu ; if(flag_r3 != 0)
...@@ -160,6 +156,10 @@ pendsv_exit ...@@ -160,6 +156,10 @@ pendsv_exit
return_without_fpu return_without_fpu
#endif #endif
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
ORR lr, lr, #0x04 ORR lr, lr, #0x04
BX lr BX lr
......
...@@ -147,16 +147,16 @@ switch_to_thread ...@@ -147,16 +147,16 @@ switch_to_thread
MSR psp, r1 ; update stack pointer MSR psp, r1 ; update stack pointer
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
IF {FPU} != "SoftVFP" IF {FPU} != "SoftVFP"
ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA. ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA.
CMP r3, #0 ; if(flag_r3 != 0) CMP r3, #0 ; if(flag_r3 != 0)
BICNE lr, lr, #0x10 ; lr &= ~(1 << 4), set FPCA. BICNE lr, lr, #0x10 ; lr &= ~(1 << 4), set FPCA.
ENDIF ENDIF
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
ORR lr, lr, #0x04 ORR lr, lr, #0x04
BX lr BX lr
ENDP ENDP
......
...@@ -145,16 +145,16 @@ switch_to_thread: ...@@ -145,16 +145,16 @@ switch_to_thread:
MSR psp, r1 /* update stack pointer */ MSR psp, r1 /* update stack pointer */
pendsv_exit:
/* restore interrupt */
MSR PRIMASK, r2
#if defined (__VFP_FP__) && !defined(__SOFTFP__) #if defined (__VFP_FP__) && !defined(__SOFTFP__)
ORR lr, lr, #0x10 /* lr |= (1 << 4), clean FPCA. */ ORR lr, lr, #0x10 /* lr |= (1 << 4), clean FPCA. */
CMP r3, #0 /* if(flag_r3 != 0) */ CMP r3, #0 /* if(flag_r3 != 0) */
BICNE lr, lr, #0x10 /* lr &= ~(1 << 4), set FPCA. */ BICNE lr, lr, #0x10 /* lr &= ~(1 << 4), set FPCA. */
#endif #endif
pendsv_exit:
/* restore interrupt */
MSR PRIMASK, r2
ORR lr, lr, #0x04 ORR lr, lr, #0x04
BX lr BX lr
......
...@@ -149,10 +149,6 @@ skip_pop_fpu ...@@ -149,10 +149,6 @@ skip_pop_fpu
MSR psp, r1 ; update stack pointer MSR psp, r1 ; update stack pointer
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
#if defined ( __ARMVFP__ ) #if defined ( __ARMVFP__ )
ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA. ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA.
CBZ r3, return_without_fpu ; if(flag_r3 != 0) CBZ r3, return_without_fpu ; if(flag_r3 != 0)
...@@ -160,6 +156,10 @@ pendsv_exit ...@@ -160,6 +156,10 @@ pendsv_exit
return_without_fpu return_without_fpu
#endif #endif
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
ORR lr, lr, #0x04 ORR lr, lr, #0x04
BX lr BX lr
......
...@@ -147,16 +147,16 @@ switch_to_thread ...@@ -147,16 +147,16 @@ switch_to_thread
MSR psp, r1 ; update stack pointer MSR psp, r1 ; update stack pointer
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
IF {FPU} != "SoftVFP" IF {FPU} != "SoftVFP"
ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA. ORR lr, lr, #0x10 ; lr |= (1 << 4), clean FPCA.
CMP r3, #0 ; if(flag_r3 != 0) CMP r3, #0 ; if(flag_r3 != 0)
BICNE lr, lr, #0x10 ; lr &= ~(1 << 4), set FPCA. BICNE lr, lr, #0x10 ; lr &= ~(1 << 4), set FPCA.
ENDIF ENDIF
pendsv_exit
; restore interrupt
MSR PRIMASK, r2
ORR lr, lr, #0x04 ORR lr, lr, #0x04
BX lr BX lr
ENDP ENDP
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册