2016-09-24 46 views
0

我有以下的半自助旅游旅行社代码中,我只是想基于变量“我”是奇数或偶数切换指示灯:半自助旅游旅行社的帮助:无法理解的变量行为

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

半自助旅游旅行社使用protothreads实施过程。 protothread没有自己的堆栈,因此protothread函数不能正确支持局部变量。尤其是,您不能依赖屈服点保留的局部变量的值。而像PROCESS_WAIT_EVENT_UNTIL这样的宏可能会导致执行到另一个protothread,所以这就是你的问题。

您需要声明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

非常感谢。你钉了它! –