2016-10-28 3 views
1

Я пытался проверить некоторые таймеры в contikiOS, я использовал printf() для вывода значения переменной, но печатное значение изменилось в соответствии с тем, как я напечатал сообщение.Неожиданное поведение в функции printf() в Contiki

Что я имею в виду ?, ну, я печатаю две переменные, RTIMER_SECOND - это длинный unsigned int, а 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 появляется во 2-й печати? является неопределенным поведением при печати% d вместо% lu RTIMER_SECOND, влияющего на следующую переменную? PS: четвертый - второй, а значение CLOCK_SECOND не равно 0.

ответ

2

printf() будет реализован ОС. Я не знаю подробностей реализации.

Я предполагаю, что переменные передаются printf() в виде последовательности байтов в стеке. Строка спецификатора сообщает функции, сколько байтов потребляет при печати вывода.

Длинное целое число без знака - 4 байта, возможно, в порядке малой последовательности. Так как 15625 меньше 2^16, то последние два байта RTIMER_SECOND равны 0. Когда строка сообщает функции только для печати 2 байта для RTIMER_SECOND, следующие два байта интерпретируются как два байта CLOCK_SECOND.

Чтобы проверить эту гипотезу, попробуйте передать значение для RTIMER_SECOND, которое занимает более 2 байтов, то есть больше 65536. В этом случае 4-я строка также будет испорчена.

+1

'printf' обычно реализуется в библиотеке C (libc), в данном случае' avr-libc', а не операционной системой. – kfx

+0

Я проверю это, в зависимости от результата я могу отправить письмо в список рассылки разработчиков, спасибо! –

Смежные вопросы