Browse Source

[fix] 无参log编译报错

Branch_elog
huangyulong 5 months ago
parent
commit
baf5c0641e
3 changed files with 8 additions and 3 deletions
  1. 1
    1
      Middlewares/elog/elog-internal.h
  2. 3
    2
      Middlewares/elog/elog.h
  3. 4
    0
      Middlewares/elog/elog_test.c

+ 1
- 1
Middlewares/elog/elog-internal.h View File

@@ -6,7 +6,7 @@
6 6
 #include <limits.h>
7 7
 
8 8
 #define MSGPTR_LEN_BITS (CHAR_BIT / 2)
9
-#define MSGPTR_LEN_BITS_OFFSET ((sizeof(msgptr_t) * CHAR_BIT) - MSGPTR_LEN_BITS)
9
+#define MSGPTR_LEN_BITS_OFFSET ((sizeof(msgptr_t) * CHAR_BIT) - MSGPTR_LEN_BITS) // << (32 - 4): 高4位(参数最多1+14个)用来存长度
10 10
 #define MSGPTR_MSG_MASK ((1 << MSGPTR_LEN_BITS_OFFSET) - 1)
11 11
 #define MSGPTR_LEN_MASK ((1 << MSGPTR_LEN_BITS) - 1)
12 12
 #define MSGPTR_LEN(v) (((v) >> MSGPTR_LEN_BITS_OFFSET) & MSGPTR_LEN_MASK)

+ 3
- 2
Middlewares/elog/elog.h View File

@@ -19,12 +19,13 @@ typedef struct {
19 19
 #define _msgparam_cast_apply(x) ((long) (x)),
20 20
 #define msgparam_cast_apply(...) EVAL(MAP(_msgparam_cast_apply, __VA_ARGS__))
21 21
 
22
+/*计算出有多少个参数, 参数数组*/
22 23
 #define ELOG(o, msg, ...) do { \
23 24
     __attribute__((section("elog"))) static const char p_msg[] = msg;  \
24 25
     IF_ELSE(HAS_ARGS(__VA_ARGS__))(    \
25
-        elog_put(o, p_msg, ELOG_NARG(__VA_ARGS__)/*计算出有多少个参数*/, (msgparam_t[]){ msgparam_cast_apply(__VA_ARGS__) }/*参数数组*/); \
26
+        elog_put(o, p_msg, ELOG_NARG(__VA_ARGS__), (msgparam_t[]){ msgparam_cast_apply(__VA_ARGS__) }); \
26 27
     )(                                 \
27
-        elog_put(o, p_msg, 0, (msgparam_t[]){}); \
28
+        elog_put(o, p_msg, 0, NULL); \
28 29
     ) \
29 30
 } while(0)
30 31
 

+ 4
- 0
Middlewares/elog/elog_test.c View File

@@ -14,7 +14,10 @@ static void log_to_semihost(elog_entry_t *e, int len, void *ctx)
14 14
     for(int i = 0; i < num; i++)
15 15
     {
16 16
         if(0 == i)
17
+        {
17 18
             rt_kprintf("0x%08X ", MSGPTR_MSG(p[i])); // 通过msg_id解出参数内容
19
+            continue;
20
+        }
18 21
 
19 22
         rt_kprintf("%d ", p[i]);
20 23
     }
@@ -27,6 +30,7 @@ int elog_test(void)
27 30
     logger = elog_init(arena, sizeof(arena));
28 31
     ELOG(logger, "Hello world %d\n", 10);  // 把字符串和参数放到内存中,(通过字符串 + 长度算法生成msg_id)和会形成一条msg_id和长度
29 32
     ELOG(logger, "test %d %d %c\n", 1, 2, 3);
33
+    ELOG(logger, "no agrc test\n");
30 34
 
31 35
     elog_flush(logger, log_to_semihost, NULL);  // 将内存中的日志刷新到文件,也可以是传输到上位机。也就是之前(字符串和参数)生成的msg_id和长度
32 36
     return 0;

Loading…
Cancel
Save