2016-09-24 3 views
0

У меня есть следующий Contiki код, где я просто пытаюсь переключать светодиоды на основе переменной «я» быть четным или нечетным:Contiki помощи: Не могу понять переменное поведение

while (1) { 
    etimer_set(&et, CLOCK_SECOND * 2); 
    PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 
    i++; 
    printf("i is %2d\n",i); 
    if ((i % 2) == 0) { 
     printf("Now go green.......\n"); 
     leds_on(LEDS_GREEN); 
     leds_off(LEDS_RED); 
    } else { 
     printf("Reds again.......\n"); 
     leds_on(LEDS_RED); 
     leds_off(LEDS_GREEN); 
    } 
} 

Поведение при запуске это на CC2650 довольно странно. Он всегда печатает i 1. Я был объявлен выше этого кода.

Если я поместил заданный по таймеру код двух строк в начале цикла, я все время рассчитываю и не испытываю никаких проблем. Но в этом случае светодиодные переключатели не видны.

Что мне здесь не хватает?

Пожалуйста, помогите

ответ

0

Contiki использует protothreads для реализации процессов. Прототип не имеет собственного стека, поэтому функции прототипов неправильно поддерживают локальные переменные. В частности, вы не можете полагаться на то, что значение локальных переменных сохраняется в точках урожая. А макросы, такие как PROCESS_WAIT_EVENT_UNTIL, могут привести к выполнению другого прототипа, так что это ваша проблема.

Вам необходимо объявить i с ключевым словом static, чтобы сохранить его значение на всем протяжении тела прототипа. В противном случае вы получите неопределенное поведение.

Например, это плохо:

int i ; 
i = 13; 
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 
printf("i=%d\n", i); // undefined behaviour 

Хотя это нормально:

int i ; 
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 
i = 13; 
printf("i=%d\n", i); // prints 13 

А также это, как i здесь находится в одном из глобальных разделов памяти:

static int i ; 
i = 13; 
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 
printf("i=%d\n", i); // prints 13 
+0

Большое вам спасибо. Ты сделал это! –

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

  • Нет связанных вопросов^_^