Contiki帮助:无法理解变量行为

时间:2016-09-24 13:16:33

标签: variables timer process contiki

我有以下Contiki代码,我只是试图根据变量'i'奇数或偶数来切换LED:

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上运行时的行为很奇怪。它始终打印我是1.我已在此代码上面声明。

如果我在循环开始时将定时器设置代码放在两行,那么我一直都很重要,没有问题。但在这种情况下,无法看到LED肘节。

我在这里缺少什么?

请帮忙

1 个答案:

答案 0 :(得分:0)

Contiki使用protothreads来实施流程。 protothread没有自己的堆栈,因此protothread函数不能正确支持局部变量。特别是,您不能依赖于屈服点保留的局部变量的值。像PROCESS_WAIT_EVENT_UNTIL这样的宏可能会让执行到另一个protothread,这就是你的问题。

您需要使用关键字i声明static,以便在整个protothread主体中保留其值。否则你会得到未定义的行为。

例如,这很糟糕:

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