2016-07-05 6 views
0

MSP-EXP430G2가 Code Composer Studio를 사용하여 LED를 깜박이는 데 필요한 튜토리얼 프로그램을 시험해보고 있습니다. 원래는 점멸을위한 무한 루프했다 :내부 루프가 무시됩니다.

for(;;) 
    // This empty for-loop will cause the lines of code within to loop infinitely 

     { 

      P1OUT ^= 0x01; 
    // Toggle P1.0 using exclusive-OR operation (^=) 

    // P1OUT is another register which holds the status of the LED. 
    // '1' specifies that it's ON or HIGH, while '0' specifies that it's OFF or LOW 
    // Since our LED is tied to P1.0, we will toggle the 0 bit of the P1OUT register 

      for(i=0; i< 20000; i++); 

    // Delay between LED toggles. This for-loop will run until the condition is met. 
    //In this case, it will loop until the variable i increments to 20000. 
     } 
    } 

이 복사했고 튜토리얼에서 붙여 넣기를 의도 한대로 일했다. 그때 나는 그것이 유한 루프로 얻을 수 있는지 확인하기 위해 싶어서에 for 루프를 변경 : J와

for (j = 0; j<10; j++) 

이전 코드에서 선언했다. 그러나 LED가 더 이상 깜박이지 않으며 디버거로 프로그램을 실행할 때 for(i=0; i< 20000; i++); 행을 완전히 건너 뜁니다. 이 경우에만 j < 조건을 설정할 때 발생하지만 j> -1로 설정하면 발생하지 않습니다. 10에서 0으로 감소하는 루프를 만들 때도 같은 문제가 발생합니다. 그러면 루프가 유한 한 경우에만 발생한다고 생각하게 만듭니다.

나는 분명한 뭔가를 놓치고 있습니까?

+0

_이 질문은 더 이상 재생할 수 없거나 간단한 입력 오류로 인해 발생한 것입니다. 비슷한 질문이 여기에 주제 일지 모르지만, 이것은 미래 독자를 돕지 않을 방법으로 해결되었습니다. 게시하기 전에 문제를 재현하는 데 필요한 가장 짧은 프로그램을 확인하고 면밀히 검사하여 피할 수 있습니다. _ –

+0

_이 경우 변수 i가 20000으로 증가 할 때까지 반복됩니다 ._ 어떻게됩니까? –

+0

@WeatherVane 네, 그 루프는 깜박일 사이의 지연을 설정합니다. 나는 LED가 깜박 거리는 횟수를 지시하는 초기 (;;)를 대체하는 것을 의미했다. –

답변

5

컴파일러는 부작용없이 코드를 최적화 할 수 있습니다. 카운터가 증가되고 나중에 사용되지 않는 내부의 for 루프는 그러한 코드의 예입니다.

이 문제를 방지하려면 루프에 부작용을 도입하십시오. 한 가지 방법은 ivolatile으로 선언하는 것입니다. 그런 다음 컴파일러는 변경 될 때마다 i 값을 메모리에 다시 쓰도록 강요되며 루프는 조건이 거짓이 될 때까지 정확한 시간을 실행합니다.

또는 종종 임베디드 플랫폼 또는 컴파일러가 delay() 및/또는 sleep() 기능을 제공합니다. 복잡한 루핑 대신 이들을 사용하는 것이 더 나은 코딩 방법입니다. 하드웨어 및 MCU 속도에 관계없이보다 결정 성있는 실행 시간을 얻을 수 있습니다.

+2

'__delay_cycles()' –

0

내부 루프 대신 delay() 또는 sleep()을 사용하는 것이 좋습니다.