提前感谢您的帮助。
首先是序言。我一直在考虑使用https://github.com/contiki-os/contiki/tree/master/core/net/mac/tsch给出的Contiki TSCH实现。在Cooja模拟器中运行一个简单的例子(我已经添加了一些日志消息到基本代码中,所以我可以看到发生了什么),我注意到ASN计数器没有递增其最重要的字节。
具体而言,ASN(TSCH的绝对时隙号)由struct
给出// 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 %u\n", (asn).ls4b, inc); \
\
uint32_t new_ls4b = (asn).ls4b + (inc); \
\
printf("TSCH INC2: new %u, old %u, inc %u\n",new_ls4b, (asn).ls4b, inc); \
\
if(new_ls4b < (asn).ls4b) { (asn).ms1b++; } \
\
printf("TSCH INC3: new %u, old %u, inc %u\n",new_ls4b, (asn).ls4b, inc); \
\
(asn).ls4b = new_ls4b; \
\
printf("TSCH INC4: new %u, old %u, inc %u\n",new_ls4b, (asn).ls4b, inc); \
} while(0);
暂时忽略printf语句(我添加了这些语句以试图了解正在发生的事情)。据我了解这个宏,会发生的是最不重要的字节首先递增。然后,如果最低有效字节环绕最高有效字节,则递增。在查看正在发生的事情的日志时,我注意到当最不重要的字节缠绕时,最重要的字节没有增加。
现在我的实际问题。为了确定最重要的字节没有递增的原因,我将上面的打印语句添加到宏中,并在实际的宏调用之上和之下添加了打印语句,如下所示(注意ASN由tsch_current_asn给出,而timeslot_diff是我想要的数量)通过增加ASN。
printf("TSCH INC BEFORE: ms1b %u, ls4b %u, inc %u\n",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 %u\n",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
具体来说,似乎在宏公司的第一个和第二个printf语句之间(timeslot_diff)从0变为1877.换句话说,它在我看来是声明
uint32_t new_ls4b = (asn).ls4b + (inc); \
更改了inc(timelot_diff)的值。此外,在我看来,这句话将ans.ls4b(tsch_current_asn.ls4b)从1877改为0.
我是否有一个关于宏如何工作的高级时刻,或者这是Contiki的protothreads(即被暂停和后来恢复)的影响?
作为参考,宏调用的实际代码在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行给出。
答案 0 :(得分:2)
看起来printf说明符与16位架构上发生的实际参数类型不匹配。对于inttypes.h
stdint.h
中使用为格式宏常量定义的说明符
即。 x
类型为uint32_t
时,您应使用
printf("x is %"PRIu32" \n", x);
而不是
printf("x is %u \n", x);