2016-09-24 26 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

非常感謝。你釘了它! –