는, 나는 다음과 같은 코드 조각 한 : 나는 코드를 컴파일 할 때 어떤 이유에서IAR 컴파일러가 멈추는 이유는 무엇입니까? <strong>IAR EWARM</strong> 개발 도구 (v7.10.3)를 사용하여 내 임베디드 프로젝트에서
/* 1 */ uint32_t packet_sync = 0;
/* 2 */ uint32_t synced = 0;
/* 3 */ uint32_t gpio = 0;
/* 4 */ while (1) {
/* 5 */ if ((packet_sync != 0) && ((packet_sync = gpio) == 0)) {
/* 6 */ if (synced < 2) {
/* 7 */ synced++;
/* 8 */ }
/* 9 */ }
/* 10 */ };
는, 컴파일러는에 걸리면 편집의 중간. 나는 여러 가지 구조로 놀아 보았는데, 내가 만든 사소한 변화처럼 보이고, 문제를 제거한다. (그러나 코드를 잘못 만들 수도있다.) 예를 들어, #의 6A에서 NOP를 추가하고 코드 는 컴파일을 성공적으로 수행합니다
/* 6 */ if (synced < 2) {
/* 6a */ __NOP();
/* 7 */ synced++;
/* 8 */ }
성공적인 변화의
다른 예는 라인 # 7을 제거하거나 같은 라인 # 5를 변경 :
/* 5 */ if ((packet_sync != 0) && ((gpio) == 0)) {
몇 가지 변형이 있습니다.
문제가있는 코드에서 C 규칙 위반이 표시되지 않으며 Visual Studio 2013에서 올바르게 컴파일됩니다. 놓친 것이 있습니까? 이 코드가 컴파일되지 않는 이유는 무엇입니까?
* 참고 : 제시된 코드는 실제 코드를 추출한 것이며 논리적으로 의미가 없습니다.
업데이트 : 코드는 "높은"/ "균형 잡힌"최적화 레벨로 컴파일됩니다. 최적화 수준이 낮아지면 컴파일이 정상적으로 끝납니다.
"높음"레벨을 사용하지만 "사용 가능한 변환 :"상자에서 최적화 옵션을 제거하면 멈추게됩니다. 또한 '속도'및 '크기'옵션을 선택해야합니다.
어떤 컴파일러 옵션을 사용하고 있습니까? 예를 들어 최적화를 켜거나 끄거나 C++ 컴파일 대신 C?를 사용하면 결과가 변경됩니까? 문제가 무엇인지 모르기 때문에 문제를 재현 할 수있는 충분한 정보가 "추상적"이라고 제시하면 어떻게 확신 할 수 있습니까? 당신이 주장하는 코드는 확실히 "SSCCE"가 아닙니다! – Clifford
첫 번째 조각에서'gpio'는 루프 불변입니다. 다른 문맥에서 변경 될 수 있다면 '휘발성 (volatile)'이라고 선언해야합니다. 다른 변수는 코드의 다른 곳에 사용법에 따라 '휘발성'으로 선언해야 할 수도 있습니다. – Clifford
@ Clifford - SSCCE를 주장하지 않았습니다. Compileable에 대한 하나의 "C"가 제거되었습니다.이 코드는 적절한 함수로 래핑되어야하기 때문입니다. 'gpio'는 실제로 불변합니다 (추출 코드에서). 이 코드는 프로젝트에서 정의 된대로 표시되었습니다. 변수는 변동이 없습니다. 당신은 코드가 * 크기 * 최적화되었다는 것을 언급하지 않았다는 점에서 옳다. 불행하게도, 프로젝트에서 거대한 재 작업을하지 않고 최적화를 제거하는 것은 어렵습니다. – ysap