이 문제가 컴파일러에 특정한 것인지 확실하지 않지만 어쨌든 물어 봅니다. 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가 계획대로 작동합니다.
나는 그것이 컴파일러에 의해 수행 된 최적화와 관련이 있다고 생각하지만, 구체적으로 무엇이 잘못 될지 전혀 모른다.
그렇습니다. 옵티마이 저는 첫 번째 경우에는 루프가 작동하지 않았지만 두 번째 경우에는 동일한 최적화를 발견하지 못했음을 발견했습니다. 주기적으로 문제가 발생하기를 원하면 전용 타이머 기능을 사용해야합니다 (대부분의 마이크로 컨트롤러에는 구성 가능한 하드웨어 타이머가 있음). –
컴파일러가 어셈블러 출력을 생성 할 수 있습니까? – usr2564301
'volatile int i;'시도해보십시오. 이렇게하면 컴파일러가 코드를 좀 더 평가할 수 있습니다. 메타 질문 : '휘발성'변수를 포함하는 코드는 여전히 최적화되어 있습니까? (Gut feeling answer : 확실하게 ...) – usr2564301