C语言 了解宏行为和原型线程



提前感谢您的帮助。

首先是前言。 我一直在考虑使用 https://github.com/contiki-os/contiki/tree/master/core/net/mac/tsch 给出的Contiki TSCH实现。 在 Cooja 模拟器中运行一个简单的示例(我已将一些日志消息添加到基本代码中,以便我可以看到发生了什么(时,我注意到 ASN 计数器没有增加其最高有效字节。

具体来说,ASN(TSCH 的绝对插槽号(由结构体给出

// data type of absolute slot number
struct tsch_asn_t {
uint32_t ls4b; /* least significant 4 bytes */
uint8_t  ms1b; /* most significant 1 byte */
};

并且基本上可以被认为是一个索引值,表示为两个变量,最高有效字节和最低有效 4 字节。 以下宏用于按设定的数量递增 ASN。

// Here is the macro
#define TSCH_ASN_INC(asn, inc) do { 
printf("TSCH INC1: new UNDEF, old %u, inc %un", (asn).ls4b, inc);  

uint32_t new_ls4b = (asn).ls4b + (inc); 

printf("TSCH INC2: new %u, old %u, inc %un",new_ls4b, (asn).ls4b, inc);  

if(new_ls4b < (asn).ls4b) { (asn).ms1b++; } 

printf("TSCH INC3: new %u, old %u, inc %un",new_ls4b, (asn).ls4b, inc);  

(asn).ls4b = new_ls4b; 

printf("TSCH INC4: new %u, old %u, inc %un",new_ls4b, (asn).ls4b, inc);  
} while(0);

暂时忽略 printf 语句(我添加了这些语句以试图了解正在发生的事情(。 据我了解,发生的情况是最低有效字节首先递增。 然后,如果最低有效字节环绕在最高有效字节周围,则递增。 但是,在查看正在发生的事情的日志时,我注意到当最低有效字节环绕时,最高有效字节没有增加。

现在谈谈我的实际问题。 为了确定为什么最高有效字节没有递增,我将上述 print 语句添加到宏中,并在实际宏调用的上方和下方添加了 print 语句,如下所示(请注意,ASN 由 tsch_current_asn 给出,timeslot_diff是我想递增 ASN 的数量(。

printf("TSCH INC BEFORE: ms1b %u, ls4b %u, inc %un",tsch_current_asn.ms1b, tsch_current_asn.ls4b, timeslot_diff);
TSCH_ASN_INC(tsch_current_asn, timeslot_diff);
printf("TSCH INC AFTER: ms1b %u, ls4b %u, inc %un",tsch_current_asn.ms1b, tsch_current_asn.ls4b, timeslot_diff);

这样做产生了以下日志,这绝对让我难倒

// LOG
TIME        DEVID   LOG MSG
00:28.885   ID:1    TSCH INC BEFORE: ms1b 0, ls4b 1877, inc 0
00:28.888   ID:1    TSCH INC1: new UNDEF, old 1877, inc 0
00:28.891   ID:1    TSCH INC2: new 1878, old 0, inc 1877
00:28.895   ID:1    TSCH INC3: new 1878, old 0, inc 1877
00:28.898   ID:1    TSCH INC4: new 1878, old 0, inc 1878
00:28.901   ID:1    TSCH INC AFTER: ms1b 0, ls4b 1878, inc 0

具体来说,似乎在宏公司(timeslot_diff(中的第一个和第二个printf语句之间从0更改为1877。 换句话说,在我看来,该声明

uint32_t new_ls4b = (asn).ls4b + (inc); 

更改了 INC(timeslot_diff(的值。 此外,在我看来,这种说法将ans.ls4b(tsch_current_asn.ls4b(从1877年改为0。

我是否有一个关于宏如何工作的资深时刻,或者这是 Contiki 的原始线程(即被暂停并随后恢复(的影响?

作为参考,宏调用的实际代码在 1035 行给出 https://github.com/contiki-os/contiki/blob/master/core/net/mac/tsch/tsch-slot-operation.c,宏在 https://github.com/contiki-os/contiki/blob/master/core/net/mac/tsch/tsch-asn.h 的第 67 行给出。

看起来 printf 说明符和实际参数类型在 16 位体系结构上发生不匹配。建议在inttypes.h中对来自stdint.h的所有整数类型使用定义为格式宏常量的说明符

即,当x属于uint32_t类型时,您应使用

printf("x is %"PRIu32" n", x);

而不是

printf("x is %u n", x);

相关内容

  • 没有找到相关文章

最新更新