Contiki

时间:2016-10-28 14:16:52

标签: printf avr iot contiki

我试图在contikiOS中测试一些计时器,我使用printf()输出变量的值,但打印值根据我打印信息的方式而改变。

我是什么意思?,我打印两个变量,RTIMER_SECOND是一个长的无符号整数,而CLOCK_SECOND是一个整数。下面的变化是我试过的,输出是下面的代码:

    printf("1->RTIMER_SECOND=%lu CLOCK_SECOND=%d\n", RTIMER_SECOND, CLOCK_SECOND);
    printf("2->RTIMER_SECOND=%d CLOCK_SECOND=%d\n\n", RTIMER_SECOND, CLOCK_SECOND);

    printf("3->CLOCK_SECOND=%d RTIMER_SECOND=%lu\n", CLOCK_SECOND,RTIMER_SECOND);
    printf("4->CLOCK_SECOND=%d RTIMER_SECOND=%d\n\n", CLOCK_SECOND,RTIMER_SECOND);

    printf("Ticks per second: %lu\n", RTIMER_SECOND);
    printf("second per second: %d\n", CLOCK_SECOND);

输出是这样的:

  

1-> RTIMER_SECOND = 15625 CLOCK_SECOND = 128

     

2-> RTIMER_SECOND = 15625 CLOCK_SECOND = 0

     

3-> CLOCK_SECOND = 128 RTIMER_SECOND = 15625

     

4-> CLOCK_SECOND = 128 RTIMER_SECOND = 15625

     

每秒蜱数:15625

     

每秒秒数:128

我的问题是为什么0出现在第二个印刷品中?打印%d而不是影响下一个变量的RTIMER_SECOND的%lu时,是未定义的行为? PS:第4个是第2个的反向,CLOCK_SECOND的值不是0。

1 个答案:

答案 0 :(得分:2)

printf()将由操作系统实施。我不知道实施的细节。

我的猜测是变量作为堆栈上的字节序列传递给printf()。说明符字符串告诉函数在打印输出时要消耗多少字节。

长无符号整数是4个字节,可能是小端序。由于15625小于2 ^ 16,所以RTIMER_SECOND的最后两个字节都是0.当字符串告诉函数只为RTIMER_SECOND打印2个字节时,接下来的两个0字节被解释为CLOCK_SECOND的两个字节。

为了测试这个假设,尝试传入RTIMER_SECOND的值,该值超过2个字节,即大于65536.在这种情况下,第4行也将被搞砸。