瀏覽代碼

[nothing]

rtthread_coredump
huangyulong 1 年之前
父節點
當前提交
b88519e5b1
共有 3 個檔案被更改,包括 153 行新增145 行删除
  1. 3
    0
      EWARM/stm32_broad_mini.ewp
  2. 148
    144
      Middlewares/coredump/coredump.c
  3. 2
    1
      Middlewares/rtthread/board.c

+ 3
- 0
EWARM/stm32_broad_mini.ewp 查看文件

@@ -1089,6 +1089,9 @@
1089 1089
             <file>
1090 1090
                 <name>$PROJ_DIR$\startup_stm32f103xb.s</name>
1091 1091
             </file>
1092
+            <file>
1093
+                <name>$PROJ_DIR$\..\Middlewares\coredump\testbug.c</name>
1094
+            </file>
1092 1095
         </group>
1093 1096
         <group>
1094 1097
             <name>User</name>

+ 148
- 144
Middlewares/coredump/coredump.c 查看文件

@@ -1,15 +1,15 @@
1 1
 // SPDX-License-Identifier: GPL-3.0-only
2 2
 /*
3
- * Copyright (c) 2008-2023 100askTeam : Dongshan WEI <weidongshan@qq.com> 
3
+ * Copyright (c) 2008-2023 100askTeam : Dongshan WEI <weidongshan@qq.com>
4 4
  * Discourse:  https://forums.100ask.net
5 5
  */
6
- 
6
+
7 7
 /*  Copyright (C) 2008-2023 深圳百问网科技有限公司
8 8
  *  All rights reserved
9 9
  *
10 10
  * 免责声明: 百问网编写的文档, 仅供学员学习使用, 可以转发或引用(请保留作者信息),禁止用于商业用途!
11 11
  * 免责声明: 百问网编写的程序, 可以用于商业用途, 但百问网不承担任何后果!
12
- * 
12
+ *
13 13
  * 本程序遵循GPL V3协议, 请遵循协议
14 14
  * 百问网学习平台   : https://www.100ask.net
15 15
  * 百问网交流社区   : https://forums.100ask.net
@@ -18,25 +18,21 @@
18 18
  * 联系我们(E-mail): weidongshan@qq.com
19 19
  *
20 20
  *          版权所有,盗版必究。
21
- *  
21
+ *
22 22
  * 修改历史     版本号           作者        修改内容
23 23
  *-----------------------------------------------------
24 24
  * 2024.10.17      v01         百问科技      创建文件
25 25
  *-----------------------------------------------------
26 26
  */
27
- 
27
+
28 28
 #include <rtthread.h>
29 29
 #include <string.h>
30 30
 #include <stdint.h>
31 31
 
32
-
33
-#if               /* ARMCC */ (  (defined ( __CC_ARM ) && defined ( __TARGET_FPU_VFP ))    \
34
-                  /* Clang */ || (defined ( __clang__ ) && defined ( __VFP_FP__ ) && !defined(__SOFTFP__)) \
35
-                  /* IAR */   || (defined ( __ICCARM__ ) && defined ( __ARMVFP__ ))        \
36
-                  /* GNU */   || (defined ( __GNUC__ ) && defined ( __VFP_FP__ ) && !defined(__SOFTFP__)) )
37
-#define USE_FPU   1
32
+#if /* ARMCC */ ((defined(__CC_ARM) && defined(__TARGET_FPU_VFP)) /* Clang */ || (defined(__clang__) && defined(__VFP_FP__) && !defined(__SOFTFP__)) /* IAR */ || (defined(__ICCARM__) && defined(__ARMVFP__)) /* GNU */ || (defined(__GNUC__) && defined(__VFP_FP__) && !defined(__SOFTFP__)))
33
+    #define USE_FPU 1
38 34
 #else
39
-#define USE_FPU   0
35
+    #define USE_FPU 0
40 36
 #endif
41 37
 
42 38
 struct exception_stack_frame
@@ -150,172 +146,180 @@ struct exception_info
150 146
 static void DumpRegisters(struct stack_frame *sp, char *thread)
151 147
 {
152 148
 #if USE_FPU
153
-	if (sp->flag) /* 使用FPU */
154
-	{
155
-		struct stack_frame_fpu *sp_fpu = (struct stack_frame_fpu *)sp;
156
-		rt_kprintf("Registers@%s\n", thread);
157
-		rt_kprintf("R0: 0x%08x\n", sp_fpu->exception_stack_frame.r0);
158
-		rt_kprintf("R1: 0x%08x\n", sp_fpu->exception_stack_frame.r1);
159
-		rt_kprintf("R2: 0x%08x\n", sp_fpu->exception_stack_frame.r2);
160
-		rt_kprintf("R3: 0x%08x\n", sp_fpu->exception_stack_frame.r3);
161
-		rt_kprintf("R4: 0x%08x\n", sp_fpu->r4);
162
-		rt_kprintf("R5: 0x%08x\n", sp_fpu->r5);
163
-		rt_kprintf("R6: 0x%08x\n", sp_fpu->r6);
164
-		rt_kprintf("R7: 0x%08x\n", sp_fpu->r7);
165
-		rt_kprintf("R8: 0x%08x\n", sp_fpu->r8);
166
-		rt_kprintf("R9: 0x%08x\n", sp_fpu->r9);
167
-		rt_kprintf("R10: 0x%08x\n", sp_fpu->r10);
168
-		rt_kprintf("R11: 0x%08x\n", sp_fpu->r11);
169
-		rt_kprintf("R12: 0x%08x\n", sp_fpu->exception_stack_frame.r12);
170
-		rt_kprintf("R13(sp_fpu): 0x%08x\n", (uint32_t)sp_fpu + sizeof(*sp_fpu));
171
-		rt_kprintf("R14(LR): 0x%08x\n", sp_fpu->exception_stack_frame.lr);
172
-		rt_kprintf("R15(PC): 0x%08x\n", sp_fpu->exception_stack_frame.pc);
173
-		rt_kprintf("xPSR: 0x%08x\n", sp_fpu->exception_stack_frame.psr);
174
-	}
175
-	else
149
+    if (sp->flag) /* 使用FPU */
150
+    {
151
+        struct stack_frame_fpu *sp_fpu = (struct stack_frame_fpu *)sp;
152
+        rt_kprintf("Registers@%s\n", thread);
153
+        rt_kprintf("R0: 0x%08x\n", sp_fpu->exception_stack_frame.r0);
154
+        rt_kprintf("R1: 0x%08x\n", sp_fpu->exception_stack_frame.r1);
155
+        rt_kprintf("R2: 0x%08x\n", sp_fpu->exception_stack_frame.r2);
156
+        rt_kprintf("R3: 0x%08x\n", sp_fpu->exception_stack_frame.r3);
157
+        rt_kprintf("R4: 0x%08x\n", sp_fpu->r4);
158
+        rt_kprintf("R5: 0x%08x\n", sp_fpu->r5);
159
+        rt_kprintf("R6: 0x%08x\n", sp_fpu->r6);
160
+        rt_kprintf("R7: 0x%08x\n", sp_fpu->r7);
161
+        rt_kprintf("R8: 0x%08x\n", sp_fpu->r8);
162
+        rt_kprintf("R9: 0x%08x\n", sp_fpu->r9);
163
+        rt_kprintf("R10: 0x%08x\n", sp_fpu->r10);
164
+        rt_kprintf("R11: 0x%08x\n", sp_fpu->r11);
165
+        rt_kprintf("R12: 0x%08x\n", sp_fpu->exception_stack_frame.r12);
166
+        rt_kprintf("R13(sp_fpu): 0x%08x\n", (uint32_t)sp_fpu + sizeof(*sp_fpu));
167
+        rt_kprintf("R14(LR): 0x%08x\n", sp_fpu->exception_stack_frame.lr);
168
+        rt_kprintf("R15(PC): 0x%08x\n", sp_fpu->exception_stack_frame.pc);
169
+        rt_kprintf("xPSR: 0x%08x\n", sp_fpu->exception_stack_frame.psr);
170
+    }
171
+    else
176 172
 #endif
177
-	{
178
-		rt_kprintf("Registers@%s\n", thread);
179
-		rt_kprintf("R0: 0x%08x\n", sp->exception_stack_frame.r0);
180
-		rt_kprintf("R1: 0x%08x\n", sp->exception_stack_frame.r1);
181
-		rt_kprintf("R2: 0x%08x\n", sp->exception_stack_frame.r2);
182
-		rt_kprintf("R3: 0x%08x\n", sp->exception_stack_frame.r3);
183
-		rt_kprintf("R4: 0x%08x\n", sp->r4);
184
-		rt_kprintf("R5: 0x%08x\n", sp->r5);
185
-		rt_kprintf("R6: 0x%08x\n", sp->r6);
186
-		rt_kprintf("R7: 0x%08x\n", sp->r7);
187
-		rt_kprintf("R8: 0x%08x\n", sp->r8);
188
-		rt_kprintf("R9: 0x%08x\n", sp->r9);
189
-		rt_kprintf("R10: 0x%08x\n", sp->r10);
190
-		rt_kprintf("R11: 0x%08x\n", sp->r11);
191
-		rt_kprintf("R12: 0x%08x\n", sp->exception_stack_frame.r12);
192
-		rt_kprintf("R13(SP): 0x%08x\n", (uint32_t)sp + sizeof(*sp));
193
-		rt_kprintf("R14(LR): 0x%08x\n", sp->exception_stack_frame.lr);
194
-		rt_kprintf("R15(PC): 0x%08x\n", sp->exception_stack_frame.pc);
195
-		rt_kprintf("xPSR: 0x%08x\n", sp->exception_stack_frame.psr);
196
-	}
197
-	
173
+    {
174
+        rt_kprintf("Registers@%s\n", thread);
175
+        rt_kprintf("R0: 0x%08x\n", sp->exception_stack_frame.r0);
176
+        rt_kprintf("R1: 0x%08x\n", sp->exception_stack_frame.r1);
177
+        rt_kprintf("R2: 0x%08x\n", sp->exception_stack_frame.r2);
178
+        rt_kprintf("R3: 0x%08x\n", sp->exception_stack_frame.r3);
179
+        rt_kprintf("R4: 0x%08x\n", sp->r4);
180
+        rt_kprintf("R5: 0x%08x\n", sp->r5);
181
+        rt_kprintf("R6: 0x%08x\n", sp->r6);
182
+        rt_kprintf("R7: 0x%08x\n", sp->r7);
183
+        rt_kprintf("R8: 0x%08x\n", sp->r8);
184
+        rt_kprintf("R9: 0x%08x\n", sp->r9);
185
+        rt_kprintf("R10: 0x%08x\n", sp->r10);
186
+        rt_kprintf("R11: 0x%08x\n", sp->r11);
187
+        rt_kprintf("R12: 0x%08x\n", sp->exception_stack_frame.r12);
188
+        rt_kprintf("R13(SP): 0x%08x\n", (uint32_t)sp + sizeof(*sp));
189
+        rt_kprintf("R14(LR): 0x%08x\n", sp->exception_stack_frame.lr);
190
+        rt_kprintf("R15(PC): 0x%08x\n", sp->exception_stack_frame.pc);
191
+        rt_kprintf("xPSR: 0x%08x\n", sp->exception_stack_frame.psr);
192
+    }
198 193
 }
199 194
 
200 195
 static void DumpMem(uint32_t addr, uint32_t len)
201 196
 {
202
-	uint32_t *paddr;
203
-	uint32_t i;
204
-
205
-	if (len == 0)
206
-		return;
207
-	
208
-	paddr = (uint32_t *)addr;
209
-	rt_kprintf("mem@0x%08x,0x%08x\n", addr, len);
210
-	
211
-	for (i = 0; i < len;)
212
-	{
213
-		rt_kprintf("0x%08x", *paddr);
214
-		paddr++;
215
-
216
-		i+= 4;
217
-		if (i % 16 == 0)
218
-			rt_kprintf("\n");
219
-		else
220
-			rt_kprintf(" ");
221
-	}
222
-	rt_kprintf("\n");
197
+    uint32_t *paddr;
198
+    uint32_t i;
199
+
200
+    if (len == 0)
201
+        return;
202
+
203
+    paddr = (uint32_t *)addr;
204
+    rt_kprintf("mem@0x%08x,0x%08x\n", addr, len);
205
+
206
+    for (i = 0; i < len;)
207
+    {
208
+        rt_kprintf("0x%08x", *paddr);
209
+        paddr++;
210
+
211
+        i += 4;
212
+        if (i % 16 == 0)
213
+            rt_kprintf("\n");
214
+        else
215
+            rt_kprintf(" ");
216
+    }
217
+    rt_kprintf("\n");
223 218
 }
224 219
 
225
-void DumpTasks(void)
220
+void DumpCurrentTask(struct stack_frame *sp)
226 221
 {
227
-    struct rt_object *object = RT_NULL;
228
-    struct rt_list_node *node = RT_NULL;
229
-    struct rt_object_information *information = RT_NULL;
230
-	struct rt_thread *thread;
231
-	rt_thread_t current_thread = rt_thread_self();
232
-	struct stack_frame *sp;
233
-	uint32_t sp_addr;
234
-	uint32_t sp_len;
222
+    uint32_t cur_sp;
223
+    uint32_t cur_sp_len;
235 224
 
236
-    information = rt_object_get_information(RT_Object_Class_Thread);
225
+    rt_thread_t current_thread = rt_thread_self();
226
+
227
+    /* 打印当前任务的寄存器 */
228
+    DumpRegisters(sp, "current_thread");
229
+
230
+    /* 打印当前任务的栈 */
231
+    rt_kprintf("Stack segment:\n");
232
+
233
+#if USE_FPU
234
+    if (sp->flag)
235
+        cur_sp = (uint32_t)sp + sizeof(struct stack_frame_fpu);
236
+    else
237
+#endif
238
+        cur_sp = (uint32_t)sp + sizeof(struct stack_frame);
239
+
240
+    cur_sp_len = (uint32_t)current_thread->stack_addr + current_thread->stack_size - cur_sp;
241
+    DumpMem(cur_sp, cur_sp_len);
242
+}
243
+
244
+void DumpDataZI(void)
245
+{
246
+#pragma section = ".data"
247
+#pragma section = ".bss"
248
+    /* 打印数据段 */
249
+    rt_kprintf("Data segment:\n");
250
+    DumpMem((uint32_t)__section_begin(".data"), (uint32_t)__section_end(".data") - (uint32_t)__section_begin(".data"));
251
+
252
+    /* 打印ZI段 */
253
+    rt_kprintf("ZI segment:\n");
254
+    DumpMem((uint32_t)__section_begin(".bss"), (uint32_t)__section_end(".bss") - (uint32_t)__section_begin(".bss"));
255
+}
256
+
257
+void DumpOtherTasks(void)
258
+{
259
+    struct rt_object_information *information = rt_object_get_information(RT_Object_Class_Thread);
237 260
 
238 261
     /* parameter check */
239 262
     if (information == RT_NULL)
240
-        return ;
263
+        return;
241 264
 
242 265
     /* enter critical */
243 266
     rt_enter_critical();
244 267
 
245 268
     /* try to find object */
269
+    rt_thread_t current_thread = rt_thread_self();
270
+    struct rt_list_node *node = RT_NULL;
271
+
246 272
     rt_list_for_each(node, &(information->object_list))
247 273
     {
248
-        object = rt_list_entry(node, struct rt_object, list);
249
-		thread = (struct rt_thread *)object;
250
-		if (thread != current_thread)
251
-		{
252
-			/* 打印线程的寄存器 */
253
-			DumpRegisters(thread->sp, thread->name);
254
-
255
-			/* 打印线程的栈 */
256
-			rt_kprintf("Stack segment:\n");
257
-			sp = (struct stack_frame *)thread->sp;
258
-#if USE_FPU			
259
-			if (sp->flag)
260
-				sp_addr = (uint32_t)sp + sizeof(struct stack_frame_fpu);
261
-			else
262
-#endif				
263
-				sp_addr = (uint32_t)sp + sizeof(struct stack_frame);
264
-
265
-			sp_len = (uint32_t)thread->stack_addr + thread->stack_size - sp_addr;
266
-			DumpMem(sp_addr, sp_len);
267
-		}
274
+        struct rt_object *object = rt_list_entry(node, struct rt_object, list);
275
+        struct rt_thread *thread = (struct rt_thread *)object;
276
+
277
+        if (thread != current_thread)
278
+        {
279
+            /* 打印线程的寄存器 */
280
+            DumpRegisters(thread->sp, thread->name);
281
+
282
+            /* 打印线程的栈 */
283
+            rt_kprintf("Stack segment:\n");
284
+            struct stack_frame *sp = (struct stack_frame *)thread->sp;
285
+            uint32_t sp_addr;
286
+#if USE_FPU
287
+            if (sp->flag)
288
+                sp_addr = (uint32_t)sp + sizeof(struct stack_frame_fpu);
289
+            else
290
+#endif
291
+                sp_addr = (uint32_t)sp + sizeof(struct stack_frame);
292
+
293
+            uint32_t sp_len = (uint32_t)thread->stack_addr + thread->stack_size - sp_addr;
294
+            DumpMem(sp_addr, sp_len);
295
+        }
268 296
     }
269 297
 
270 298
     /* leave critical */
271 299
     rt_exit_critical();
272
-
273 300
 }
274 301
 
275 302
 #pragma section = ".data"
276 303
 #pragma section = ".bss"
277 304
 
278
-void DumpCore(struct    stack_frame *sp)
305
+void DumpCore(struct stack_frame *sp)
279 306
 {
280
-	uint32_t cur_sp;
281
-	uint32_t cur_sp_len;
282
-
283
-	rt_thread_t current_thread = rt_thread_self();
284
-	
285
-	/* 打印当前任务的寄存器 */
286
-	DumpRegisters(sp, "current_thread");
287
-
288
-	/* 打印当前任务的栈 */
289
-	rt_kprintf("Stack segment:\n");
290
-	
291
-#if USE_FPU			
292
-	if (sp->flag)
293
-		cur_sp = (uint32_t)sp + sizeof(struct stack_frame_fpu);
294
-	else
295
-#endif		
296
-		cur_sp = (uint32_t)sp + sizeof(struct stack_frame);
297
-	
298
-	cur_sp_len = (uint32_t)current_thread->stack_addr + current_thread->stack_size - cur_sp;
299
-	DumpMem(cur_sp, cur_sp_len);
300
-
301
-	/* 打印数据段 */
302
-	rt_kprintf("Data segment:\n");
303
-	DumpMem((uint32_t)__section_begin(".data"), (uint32_t)__section_end(".data") - (uint32_t)__section_begin(".data"));
304
-
305
-	/* 打印ZI段 */
306
-	rt_kprintf("ZI segment:\n");
307
-	DumpMem((uint32_t)__section_begin(".bss"), (uint32_t)__section_end(".bss") - (uint32_t)__section_begin(".bss"));
308
-
309
-	/* 打印其他任务的寄存器和栈 */
310
-	DumpTasks();
307
+    /* 打印当前任务寄存器和栈 */
308
+    DumpCurrentTask(sp);
309
+
310
+    /* 打印数据段 */
311
+    DumpDataZI();
312
+
313
+    /* 打印其他任务的寄存器和栈 */
314
+    DumpOtherTasks();
311 315
 }
312 316
 
313 317
 void rt_hw_hard_fault_exception(struct exception_info *exception_info)
314 318
 {
315
-	DumpCore(&exception_info->stack_frame);
316
-    while (1);
319
+    DumpCore(&exception_info->stack_frame);
320
+    while (1)
321
+    ;
317 322
 }
318 323
 
319 324
 void coredump_cmd_asm(void);
320 325
 MSH_CMD_EXPORT_ALIAS(coredump_cmd_asm, coredump, coredump from user);
321
-

+ 2
- 1
Middlewares/rtthread/board.c 查看文件

@@ -95,7 +95,8 @@ void SysInit(void)
95 95
 
96 96
 int main(void)
97 97
 {
98
-    rt_kprintf("%s\n", __func__);
98
+    //rt_kprintf("%s\n", __func__);
99
+    test_softbreakpoint();
99 100
     return 0;
100 101
 }
101 102
 

Loading…
取消
儲存