Procházet zdrojové kódy

[add] 打印全局变量

rtthread_MCoreDump
huangyulong před 5 měsíci
rodič
revize
20af1bd0fb

+ 1
- 29
Middlewares/MCoreDump/arch/armv7m/armv7m.c Zobrazit soubor

202
 
202
 
203
 #endif
203
 #endif
204
 
204
 
205
+// 有架构区别
205
 void print_registers_armv7m(core_regset_type *reg, fp_regset_type *fp_reg, char *thread)
206
 void print_registers_armv7m(core_regset_type *reg, fp_regset_type *fp_reg, char *thread)
206
 {
207
 {
207
     mcd_print("Registers@%s\n", thread);
208
     mcd_print("Registers@%s\n", thread);
224
     mcd_print("xPSR: 0x%08x\n", reg->xpsr);
225
     mcd_print("xPSR: 0x%08x\n", reg->xpsr);
225
 }
226
 }
226
 
227
 
227
-void print_mem_armv7m(uint32_t addr, uint32_t len)
228
-{
229
-    uint32_t *paddr;
230
-    uint32_t i;
231
-
232
-    if (len == 0)
233
-        return;
234
-
235
-    paddr = (uint32_t *)addr;
236
-    mcd_print("mem@0x%08x,0x%08x\n", addr, len);
237
-
238
-    for (i = 0; i < len;)
239
-    {
240
-        mcd_print("0x%08x", *paddr);
241
-        paddr++;
242
-
243
-        i += 4;
244
-        if (i % 16 == 0)
245
-            mcd_print("\n");
246
-        else
247
-            mcd_print(" ");
248
-    }
249
-
250
-    mcd_print("\n");
251
-
252
-    if (len % 16 != 0)
253
-        mcd_print("\n");
254
-}
255
-
256
 /**
228
 /**
257
  * @brief Collect ARM Cortex-M4 registers from RT-Thread stack frame
229
  * @brief Collect ARM Cortex-M4 registers from RT-Thread stack frame
258
  *
230
  *

+ 0
- 6
Middlewares/MCoreDump/arch/mcd_arch_interface.h Zobrazit soubor

11
 #ifndef __MCD_ARCH_INTERFACE_H__
11
 #ifndef __MCD_ARCH_INTERFACE_H__
12
 #define __MCD_ARCH_INTERFACE_H__
12
 #define __MCD_ARCH_INTERFACE_H__
13
 
13
 
14
-#include <stdint.h>
15
-
16
 /**
14
 /**
17
  * @brief Architecture-specific hard fault exception handler
15
  * @brief Architecture-specific hard fault exception handler
18
  *
16
  *
39
 
37
 
40
 // 打印寄存器
38
 // 打印寄存器
41
 void print_registers_armv7m(core_regset_type *reg, fp_regset_type *fp_reg, char *thread);
39
 void print_registers_armv7m(core_regset_type *reg, fp_regset_type *fp_reg, char *thread);
42
-// 打印一段内存
43
-void print_mem_armv7m(uint32_t addr, uint32_t len);
44
 
40
 
45
 /* Generic interface macro for architecture-agnostic code */
41
 /* Generic interface macro for architecture-agnostic code */
46
     #define collect_registers collect_registers_armv7m
42
     #define collect_registers collect_registers_armv7m
47
     #define print_registers print_registers_armv7m
43
     #define print_registers print_registers_armv7m
48
-    #define print_mem print_mem_armv7m
49
     #define arch_hard_fault_exception_hook armv7m_hard_fault_exception_hook
44
     #define arch_hard_fault_exception_hook armv7m_hard_fault_exception_hook
50
 
45
 
51
 #elif defined(PKG_USING_MCOREDUMP_ARCH_ARMV8M)
46
 #elif defined(PKG_USING_MCOREDUMP_ARCH_ARMV8M)
66
 /* Generic interface macro for architecture-agnostic code */
61
 /* Generic interface macro for architecture-agnostic code */
67
     #define collect_registers collect_registers_armv8m
62
     #define collect_registers collect_registers_armv8m
68
     #define print_registers
63
     #define print_registers
69
-    #define print_mem
70
     #define arch_hard_fault_exception_hook armv8m_hard_fault_exception_hook
64
     #define arch_hard_fault_exception_hook armv8m_hard_fault_exception_hook
71
 #else
65
 #else
72
     #error "MCoredump does not support this architecture"
66
     #error "MCoredump does not support this architecture"

+ 41
- 0
Middlewares/MCoreDump/coredump.h Zobrazit soubor

11
 #ifndef __COREDUMP_H__
11
 #ifndef __COREDUMP_H__
12
 #define __COREDUMP_H__
12
 #define __COREDUMP_H__
13
 
13
 
14
+#include <stddef.h>
14
 #include "mcd_cfg.h"
15
 #include "mcd_cfg.h"
15
 #include "arm/mcd_arm_define.h"
16
 #include "arm/mcd_arm_define.h"
16
 
17
 
18
+#define MCD_SECTION(x) @ x
19
+#define MCD_USED __root
20
+
17
 /**
21
 /**
18
  * @brief Function pointer type for coredump data output
22
  * @brief Function pointer type for coredump data output
19
  *
23
  *
139
 // 保存RTOS所有线程:更新当前寄存器到全局变量
143
 // 保存RTOS所有线程:更新当前寄存器到全局变量
140
 void mcd_multi_dump(void);
144
 void mcd_multi_dump(void);
141
 
145
 
146
+// 打印一段内存
147
+void print_mem(uint32_t addr, uint32_t len);
148
+// 单独打印全局变量
149
+void print_variable(void *addr, int size);
150
+// 打印宏定义的所有全局变量
151
+int mcd_variable_dump(void);
152
+
153
+#define COREADUMP_PRINT_ITEM_SIZE 2
154
+// 打印一个变量
155
+#define COREADUMP_PRINT_VARIABLE_DEFINE(name) \
156
+MCD_USED const uint32_t __coreadump_rang_##name[COREADUMP_PRINT_ITEM_SIZE] MCD_SECTION(".coreadump_rang.1") = { (uint32_t)&name, sizeof(name) }
157
+
158
+// 打印一段内存
159
+#define COREADUMP_PRINT_RANGE_DEFINE(index, addr, size) \
160
+MCD_USED const uint32_t __coreadump_rang_##index[COREADUMP_PRINT_ITEM_SIZE] MCD_SECTION(".coreadump_rang.2") = { (uint32_t)addr, (uint32_t)size }
161
+
162
+#define COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM 3
163
+
164
+// 运行时动态打印全局变量
165
+inline int COREADUMP_PRINT_RANGE_DYNAMIC(void *addr, int size)
166
+{
167
+    extern void *sg_cd_variable_addr[COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM];
168
+    extern int sg_cd_variable_sizeof[COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM];
169
+
170
+    for (int i = 0; i < COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM; i++)
171
+    {
172
+        if (NULL == sg_cd_variable_addr[i] && 0 == sg_cd_variable_sizeof[i])
173
+        {
174
+            sg_cd_variable_addr[i] = addr;
175
+            sg_cd_variable_sizeof[i] = size;
176
+            return 0;
177
+        }
178
+    }
179
+
180
+    return -1;
181
+}
182
+
142
 /**
183
 /**
143
  * @brief Generate coredump with all threads information
184
  * @brief Generate coredump with all threads information
144
  *
185
  *

+ 63
- 1
Middlewares/MCoreDump/faultdump.c Zobrazit soubor

22
 
22
 
23
 /* Static memory buffer for coredump storage */
23
 /* Static memory buffer for coredump storage */
24
 #ifndef PKG_MCOREDUMP_MEMORY_SIZE
24
 #ifndef PKG_MCOREDUMP_MEMORY_SIZE
25
-#define COREDUMP_MEMORY_SIZE        (8 * 1024)    /* Default 8KB buffer size */
25
+#define COREDUMP_MEMORY_SIZE        1//(8 * 1024)    /* Default 8KB buffer size */
26
 #else
26
 #else
27
 #define COREDUMP_MEMORY_SIZE        PKG_MCOREDUMP_MEMORY_SIZE
27
 #define COREDUMP_MEMORY_SIZE        PKG_MCOREDUMP_MEMORY_SIZE
28
 #endif
28
 #endif
504
     return MCD_OK;
504
     return MCD_OK;
505
 }
505
 }
506
 MCD_CMD_EXPORT(mcd_dump_memory, Print memory coredump via serial);
506
 MCD_CMD_EXPORT(mcd_dump_memory, Print memory coredump via serial);
507
+
508
+
509
+// 自定义:和架构无关
510
+void print_mem(uint32_t addr, uint32_t len)
511
+{
512
+    uint32_t *paddr;
513
+    uint32_t i;
514
+
515
+    if (len == 0)
516
+        return;
517
+
518
+    paddr = (uint32_t *)addr;
519
+    mcd_print("mem@0x%08x,0x%08x\n", addr, len);
520
+
521
+    for (i = 0; i < len;)
522
+    {
523
+        mcd_print("0x%08x", *paddr);
524
+        paddr++;
525
+
526
+        i += 4;
527
+        if (i % 16 == 0)
528
+            mcd_print("\n");
529
+        else
530
+            mcd_print(" ");
531
+    }
532
+
533
+    mcd_print("\n");
534
+
535
+    if (len % 16 != 0)
536
+        mcd_print("\n");
537
+}
538
+
539
+#pragma section = ".data"
540
+#pragma section = ".bss"
541
+// 打印变量用
542
+void *sg_cd_variable_addr[COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM];
543
+int sg_cd_variable_sizeof[COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM];
544
+static const int __coreadump_variable_start[COREADUMP_PRINT_ITEM_SIZE]MCD_SECTION(".coreadump_rang.0") = {0};
545
+static const int __coreadump_variable_stop[COREADUMP_PRINT_ITEM_SIZE]MCD_SECTION(".coreadump_rang.end") = {0};
546
+
547
+void print_variable(void *addr, int size)
548
+{
549
+    mcd_print("Data segment:\n");
550
+    print_mem((uint32_t)addr, size);
551
+}
552
+
553
+int mcd_variable_dump(void)
554
+{
555
+    /* 打印变量 */
556
+    //  print_variable(&dev_property, sizeof(dev_property));
557
+
558
+    for (int i = 0; i < COREADUMP_PRINT_RANGE_DYNAMIC_MAX_NUM; i++)
559
+    {
560
+        if (sg_cd_variable_addr[i] && sg_cd_variable_sizeof[i])
561
+            print_variable(sg_cd_variable_addr[i], sg_cd_variable_sizeof[i]);
562
+    }
563
+
564
+    for (uint32_t *p = (uint32_t *)&__coreadump_variable_start + COREADUMP_PRINT_ITEM_SIZE; p < (uint32_t *)&__coreadump_variable_stop; p += COREADUMP_PRINT_ITEM_SIZE)
565
+        print_variable((void *)(p[0]), p[1]);
566
+
567
+    return 0;
568
+}

+ 1
- 0
Middlewares/MCoreDump/rtthread_port.c Zobrazit soubor

232
         }
232
         }
233
     }
233
     }
234
 
234
 
235
+    mcd_variable_dump();
235
     return 0;
236
     return 0;
236
 }
237
 }
237
 #endif
238
 #endif

+ 3
- 0
Middlewares/rtthread/board.c Zobrazit soubor

59
 }
59
 }
60
 #endif
60
 #endif
61
 
61
 
62
+#include "coredump.h"
63
+COREADUMP_PRINT_VARIABLE_DEFINE(rt_heap);
64
+
62
 /**
65
 /**
63
  * This function will initial your board.
66
  * This function will initial your board.
64
  */
67
  */

Načítá se…
Zrušit
Uložit