2014-11-25 2 views
0

내 C 프로젝트를 실행하는 데 IAR (버전 : 6.60.1.5104)을 사용하고 있습니다.값이 <unavailable> 인 IAR

이상한 행동이 나타납니다.

내가 zero

예로서 로컬로 정의 된 변수의 값을 얻고 디버깅하는 동안.

int a = 0 

그러나 할당 된 변수의 경우 0이 아닌 값은 <available>입니다.

나는 코드 아래에 언급 한이 지속적으로 일어나고

int someFun(): 
{ 
    int32_t a = 0; //IAR says it <unavailable> 
    int32_t b = 1; 
    printf("%d%d", a,b); 
} 

. 도와주세요

답변

2

이것은 아마도 변수가 최적화되었음을 의미합니다. 즉, 프로그램이 실행될 때 변수가없는 것입니다. 변수의 값은 변경되지 않으므로 최적화 컴파일러는이를 제거하고 printf() 호출이 값을 직접 사용하도록 만듭니다.

프로그램을 분해하여 호출이 어떻게 생성되는지 확인하십시오.

특정 컴파일러에 대한 컴파일러 최적화를 비활성화하는 방법을 알아보십시오 (문서 읽기).

+0

가능한 원인입니다. IAR (ARM)은 최적화 수준 '낮음'이상에서 CPU 레지스터를 적극적으로 재사용합니다. 내 기억이 올바르게 작동한다면 기본적으로 디버그 빌드에서도 '낮음'이 활성화되지만 가능한 가장 낮은 수준은 '없음'입니다. – user694733

+0

IAR (제 경우의 경우 8051)은 공격적으로 회선을 최적화하므로, 해당 영역을 중단하려면 회선이 없어지기 때문에 할 수 없습니다. asm ("nop")을 넣을 수 있습니다. 줄을 서서 끊어 라. 옵티마이 저는 해당 행을 만지지 않습니다. 최적화 도구가 변수를 털어 버리지 않도록하는 비슷한 기법이 있습니까? – therealjumbo

+0

이 문제를 해결하려면 변수를 '휘발성'으로 선언하십시오. 나는 그 일을 전에 생각하지 않았다는 것을 믿을 수 없다. – therealjumbo