2016-09-24 3 views
0

난 그냥 변수 '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에서 아주 이상합니다. 항상 i는 1입니다.이 코드 위에 선언되었습니다.

그러나 루프의 시작 부분에 두 줄의 타이머 세트 코드를 배치하면 모든 점을 고려하여 아무런 문제가 없습니다. 그러나이 경우 LED 토글을 볼 수 없습니다.

무엇이 여기에 있습니까?

답변

0

컨티키이 프로세스를 구현하기 위해 protothreads를 사용하여 도와주세요. protothread에는 자체 스택이 없으므로 protothread 함수가 로컬 변수를 제대로 지원하지 않습니다. 특히 항복점간에 보존되는 지역 변수의 가치에 의존 할 수 없습니다. PROCESS_WAIT_EVENT_UNTIL과 같은 매크로는 다른 protothread로 실행을 생성 할 수 있으므로 문제가됩니다.

static 키워드를 사용하여 i을 선언해야 모든 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 
+0

정말 고마워요. 니가 끝냈어! –