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
 #include <limits.h>
6
 #include <limits.h>
7
 
7
 
8
 #define MSGPTR_LEN_BITS (CHAR_BIT / 2)
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
 #define MSGPTR_MSG_MASK ((1 << MSGPTR_LEN_BITS_OFFSET) - 1)
10
 #define MSGPTR_MSG_MASK ((1 << MSGPTR_LEN_BITS_OFFSET) - 1)
11
 #define MSGPTR_LEN_MASK ((1 << MSGPTR_LEN_BITS) - 1)
11
 #define MSGPTR_LEN_MASK ((1 << MSGPTR_LEN_BITS) - 1)
12
 #define MSGPTR_LEN(v) (((v) >> MSGPTR_LEN_BITS_OFFSET) & MSGPTR_LEN_MASK)
12
 #define MSGPTR_LEN(v) (((v) >> MSGPTR_LEN_BITS_OFFSET) & MSGPTR_LEN_MASK)

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

19
 #define _msgparam_cast_apply(x) ((long) (x)),
19
 #define _msgparam_cast_apply(x) ((long) (x)),
20
 #define msgparam_cast_apply(...) EVAL(MAP(_msgparam_cast_apply, __VA_ARGS__))
20
 #define msgparam_cast_apply(...) EVAL(MAP(_msgparam_cast_apply, __VA_ARGS__))
21
 
21
 
22
+/*计算出有多少个参数, 参数数组*/
22
 #define ELOG(o, msg, ...) do { \
23
 #define ELOG(o, msg, ...) do { \
23
     __attribute__((section("elog"))) static const char p_msg[] = msg;  \
24
     __attribute__((section("elog"))) static const char p_msg[] = msg;  \
24
     IF_ELSE(HAS_ARGS(__VA_ARGS__))(    \
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
 } while(0)
30
 } while(0)
30
 
31
 

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

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

Loading…
Cancel
Save