2014-04-21 3 views
1

이 문제가 컴파일러에 특정한 것인지 확실하지 않지만 어쨌든 물어 봅니다. CCS (Code Composer Studio)를 사용하고 있는데 이것은 MSP430 마이크로 컨트롤러를 프로그래밍하기위한 텍사스 기기의 IDE입니다.예기치 않게 루프가 돌아가는 중

평상시처럼 P1OUT 레지스터의 마지막 비트에있는 LED를 깜박이는 초보자 프로그램을 만들고 있습니다. 여기에 작동하지 않는 코드 (I는 관련이없는 다른 선언의 일부를 생략했습니다)의 :

while(1){ 
    int i; 

    P1OUT ^= 0x01; 

    i = 0; 
    while(i < 10000){ 
     i++; 
    } 

} 

두 개의 문 : 이제

while(1){ 
     int i; 

     P1OUT ^= 0x01; 

     i = 10000; 
     while(i != 0){ 
      i--; 
     } 

    } 

가 여기에 작업을 수행하는 루프입니다 는 동일해야하지만, 첫 번째 인스턴스에서는 LED가 켜져 있고 깜박이지 않는 반면, 두 번째에서는 LED가 계획대로 작동합니다.

나는 그것이 컴파일러에 의해 수행 된 최적화와 관련이 있다고 생각하지만, 구체적으로 무엇이 잘못 될지 전혀 모른다.

+0

그렇습니다. 옵티마이 저는 첫 번째 경우에는 루프가 작동하지 않았지만 두 번째 경우에는 동일한 최적화를 발견하지 못했음을 발견했습니다. 주기적으로 문제가 발생하기를 원하면 전용 타이머 기능을 사용해야합니다 (대부분의 마이크로 컨트롤러에는 구성 가능한 하드웨어 타이머가 있음). –

+0

컴파일러가 어셈블러 출력을 생성 할 수 있습니까? – usr2564301

+2

'volatile int i;'시도해보십시오. 이렇게하면 컴파일러가 코드를 좀 더 평가할 수 있습니다. 메타 질문 : '휘발성'변수를 포함하는 코드는 여전히 최적화되어 있습니까? (Gut feeling answer : 확실하게 ...) – usr2564301

답변

3

코드가 아마도 불필요한 코드로 최적화되었습니다. 당신은 어쨌든 그렇게 회전하지 않으려 고합니다. CPU 사이클에서 엄청나게 낭비입니다. 당신은 (또한 프로젝트 속성에 최적화 수준을 확인) 기대하지 않을 수있는 방법으로 코드를 최적화 할 수 있습니다

#include <unistd.h> 

int microseconds = // number of 1000ths of milliseconds to wait 
while(1){ 
    P1OUT ^= 0x01; 
    usleep(microseconds); 
} 
+0

MSP430 표준 라이브러리에'usleep' 기능이 있습니까? 나는 그랬다면 놀랄 것입니다. – Gabe

+0

@Gabe - 나도 그렇게 생각하고 있었다. MSP430은 전형적인 리눅스 운영체제가 아닙니다. 토스터 컨트롤러 위에 간신히 있습니다. –

+0

@Gabe [this] (http://mykyta.info/a/embedded/msp430/group___m_o_d___s_l_e_p.html) –

0

CCS : 당신은 단순히 같은 뭔가를 usleep를 호출합니다. 가장 쉬운 방법은 volatile 키워드로 변수를 선언하는 것입니다.

관련 문제