我有以下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肘节。
我在这里缺少什么?
请帮忙
答案 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