Ver código fonte

[add] 打印全局变量

rtthread_MCoreDump
huangyulong 2 meses atrás
pai
commit
20af1bd0fb

+ 1
- 29
Middlewares/MCoreDump/arch/armv7m/armv7m.c Ver arquivo

@@ -202,6 +202,7 @@ void mcd_multi_dump(void)
202 202
 
203 203
 #endif
204 204
 
205
+// 有架构区别
205 206
 void print_registers_armv7m(core_regset_type *reg, fp_regset_type *fp_reg, char *thread)
206 207
 {
207 208
     mcd_print("Registers@%s\n", thread);
@@ -224,35 +225,6 @@ void print_registers_armv7m(core_regset_type *reg, fp_regset_type *fp_reg, char
224 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 229
  * @brief Collect ARM Cortex-M4 registers from RT-Thread stack frame
258 230
  *

+ 0
- 6
Middlewares/MCoreDump/arch/mcd_arch_interface.h Ver arquivo

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

+ 41
- 0
Middlewares/MCoreDump/coredump.h Ver arquivo

@@ -11,9 +11,13 @@
11 11
 #ifndef __COREDUMP_H__
12 12
 #define __COREDUMP_H__
13 13
 
14
+#include <stddef.h>
14 15
 #include "mcd_cfg.h"
15 16
 #include "arm/mcd_arm_define.h"
16 17
 
18
+#define MCD_SECTION(x) @ x
19
+#define MCD_USED __root
20
+
17 21
 /**
18 22
  * @brief Function pointer type for coredump data output
19 23
  *
@@ -139,6 +143,43 @@ void mcd_mini_dump(void);
139 143
 // 保存RTOS所有线程:更新当前寄存器到全局变量
140 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 184
  * @brief Generate coredump with all threads information
144 185
  *

+ 63
- 1
Middlewares/MCoreDump/faultdump.c Ver arquivo

@@ -22,7 +22,7 @@
22 22
 
23 23
 /* Static memory buffer for coredump storage */
24 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 26
 #else
27 27
 #define COREDUMP_MEMORY_SIZE        PKG_MCOREDUMP_MEMORY_SIZE
28 28
 #endif
@@ -504,3 +504,65 @@ static int mcd_dump_memory(void)
504 504
     return MCD_OK;
505 505
 }
506 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 Ver arquivo

@@ -232,6 +232,7 @@ static int mcd_print_coredump_info_string(struct thread_info_ops *ops)
232 232
         }
233 233
     }
234 234
 
235
+    mcd_variable_dump();
235 236
     return 0;
236 237
 }
237 238
 #endif

+ 3
- 0
Middlewares/rtthread/board.c Ver arquivo

@@ -59,6 +59,9 @@ RT_WEAK void *rt_heap_end_get(void)
59 59
 }
60 60
 #endif
61 61
 
62
+#include "coredump.h"
63
+COREADUMP_PRINT_VARIABLE_DEFINE(rt_heap);
64
+
62 65
 /**
63 66
  * This function will initial your board.
64 67
  */

Carregando…
Cancelar
Salvar