浏览代码

[update] FPU支持HardFault_Handler

rtthread_coredump
huangyulong 1年前
父节点
当前提交
05991cc002
共有 2 个文件被更改,包括 38 次插入31 次删除
  1. 37
    30
      Middlewares/coredump/coredump_cmd.S
  2. 1
    1
      Middlewares/rtthread/rtconfig.h

+ 37
- 30
Middlewares/coredump/coredump_cmd.S 查看文件

@@ -54,45 +54,52 @@ coredump_cmd_asm:
54 54
 	POP {r0} /* xpsr */
55 55
         BX      LR
56 56
 
57
-	IMPORT rt_hw_hard_fault_exception
58
-	EXPORT HardFault_Handler
57
+    IMPORT rt_hw_hard_fault_exception
58
+    EXPORT HardFault_Handler
59 59
 HardFault_Handler:
60 60
 
61
-	; get current context
62
-	MRS 	r0, msp 				; get fault context from handler.
63
-	TST 	lr, #0x04				; if(!EXC_RETURN[2])
64
-	BEQ 	_get_sp_done
65
-	MRS 	r0, psp 				; get fault context from thread.
61
+    ; get current context
62
+    MRS     r0, msp                 ; get fault context from handler.
63
+    TST     lr, #0x04               ; if(!EXC_RETURN[2])
64
+    BEQ     _get_sp_done
65
+    MRS     r0, psp                 ; get fault context from thread.
66 66
 _get_sp_done
67 67
 
68
-	STMFD	r0!, {r4 - r11} 		; push r4 - r11 register
69
-	;STMFD	 r0!, {lr}				 ; push exec_return register
70 68
 #if defined ( __ARMVFP__ )
71
-	MOV  R1, #0   ; not use FPU
72
-	TST  lr, #(1<<4)
73
-	BNE  _set_flag_done
74
-	MOV  R1, #1   ; use FPU
75
-_set_flag_done	  
76
-	SUB 	r0, r0, #0x04			; push dummy for flag
77
-	STR 	R1, [r0]
69
+    TST     lr, #0x10               ; if(!EXC_RETURN[4])
70
+    BNE     skip_push_fpu
71
+    VSTMDB  r0!, {d8 - d15}         ; push FPU register s16~s31
72
+skip_push_fpu
78 73
 #endif
79
-	SUB 	r0, r0, #0x04
80
-	STR 	lr, [r0]
81 74
 
82
-	TST 	lr, #0x04				; if(!EXC_RETURN[2])
83
-	BEQ 	_update_msp
84
-	MSR 	psp, r0 				; update stack pointer to PSP.
85
-	B		_update_done
75
+    STMFD   r0!, {r4 - r11}         ; push r4 - r11 register
76
+
77
+#if defined ( __ARMVFP__ )
78
+    MOV     r4, #0x00               ; flag = 0
79
+    TST     lr, #0x10               ; if(!EXC_RETURN[4])
80
+    BNE     push_flag
81
+    MOV     r4, #0x01               ; flag = 1
82
+push_flag
83
+    STMFD   r0!, {r4}              ; push flag
84
+#endif
85
+
86
+    STMFD   r0!, {lr}              ; push flag
87
+
88
+    TST     lr, #0x04               ; if(!EXC_RETURN[2])
89
+    BEQ     _update_msp
90
+    MSR     psp, r0                 ; update stack pointer to PSP.
91
+    B       _update_done
86 92
 _update_msp
87
-	MSR 	msp, r0 				; update stack pointer to MSP.
93
+    MSR     msp, r0                 ; update stack pointer to MSP.
88 94
 _update_done
89 95
 
90
-	PUSH	{lr}
91
-	BL		rt_hw_hard_fault_exception
92
-	POP 	{lr}
96
+    PUSH    {lr}
97
+    BL      rt_hw_hard_fault_exception
98
+    POP     {lr}
99
+
100
+    ORR     lr, lr, #0x04
101
+    BX      lr
102
+
103
+    END
93 104
 
94
-	ORR 	lr, lr, #0x04
95
-	BX		lr
96
-        
97
-        END
98 105
 

+ 1
- 1
Middlewares/rtthread/rtconfig.h 查看文件

@@ -67,7 +67,7 @@
67 67
 
68 68
 // <e>Software timers Configuration
69 69
 // <i> Enables user timers
70
-#define RT_USING_TIMER_SOFT         0
70
+#define RT_USING_TIMER_SOFT         1
71 71
 #if RT_USING_TIMER_SOFT == 0
72 72
     #undef RT_USING_TIMER_SOFT
73 73
 #endif

正在加载...
取消
保存