提前谢谢你的帮助。
首先是前言。我一直在考虑使用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 %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

具体来说,在宏inc(时隙diff)中的第一个和第二个printf语句之间,似乎从0更改为1877。换句话说,在我看来
uint32_t new_ls4b = (asn).ls4b + (inc); \

更改inc(时隙差异)的值。此外,在我看来,该语句将ans.ls4b(tsch_current_asn.ls4b)从1877更改为0。
我是否有一个高级的时间来讨论宏是如何工作的,或者这是Contiki的protothreads的影响(即被挂起并随后恢复)?
作为参考,宏调用的实际代码在
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中定义为格式宏常量的说明符
即当xuint32_t类型时,您应使用

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

而不是
printf("x is %u \n", x);

关于c - 了解宏行为和原型(prototype)线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50440574/

10-10 21:37