2013-10-27 2 views
1

/C++ comparsion 연산자 동작 :IAR C 내가 정의 다음 한

#define DEVICE_ID ((uint8_t)0x3f) 

을 내가 기능을 다음과 같은 한 :이 기능에 단계별로 갈 경우,

void LIS3DSH_Init(LIS3DSH_InitTypeDef* LIS3DSH_InitStruct) 
{ 
// uint8_t ctrl=0x00; 
    uint8_t ident=0x00; 

    LIS3DSH_LowLevel_Init(); 

    LIS3DSH_Read(&ident, 
       LIS3DSH_WHOAMI_REG_ADDR, 
       1); 

    if(DEVICE_ID==ident) 
    { 
     // LIS3DSH detected 
    } 
    else 
    { 
     // LIS3DSH not detected 

     failureHandler(); 
    } 

} // LIS3DSH_Init 

자, ident 변수는 LIS3DSH_Read 함수 호출 후에 값 0x3f를 얻습니다. 제 질문은, 왜 지옥 if 절이 failureHandler로 점프합니까? DEVICE_ID 및 ident의 값은 동일합니다. failureHanlder()로 이동하면 안되면 둘 다 0x3f입니다. 나는 IAR C/C++과 STM32F4 Discovery Board를 사용하는 LIS3DSH 가속기 라이브러리에 대해 연구 중이다. If clause going wrong?!

+1

DEVICE_ID를 마스킹하는 다른 정의가 있는지 확인하십시오. – stark

+0

코드에서 DEVICE_ID를 정의한 행을 주석 처리했으며 DEVICE_ID를 찾을 수 없어 프로젝트가 빌드되지 않습니다. – KernelPanic

+0

나는 당신이 우리에게 보여주고있는 의사 코드에 문제가 있다고 생각하지 않는다. * 실제 코드를 더 추가 할 수 있습니까? –

답변

1

입력 캐스팅해야 if(DEVICE_ID==ident)이 나를 위해 과거에 문제가있다 if((uint8_t)DEVICE_ID == (uint8_t)ident)

합니다.

그렇습니다. ident를 volatile로 선언하고 디버깅을 위해 for 루프를 통해 비교하기 전에 지연을 추가해보십시오. 내부에 __no_operation();이 있습니다. 그 앞에는 2 개의 밑줄이 있으며 1 (내장 NOP 명령)이 아니며 범위를 통해 측정 된 단일 NOP는 168MHz 보드에서 약 29ns가 걸립니다.

또한 IAR이 있으므로 "어셈블리"뷰를 열고 레지스터 및/또는 상수를 실제로 비교할 수 있습니다. "register"뷰를 열어서 레지스터 값 자체를 볼 수 있습니다.

+0

예, 고맙습니다.하지만 제 경우에는 최적화가 문제였습니다. 나는 모든 최적화를 비활성화했고 이제는 괜찮습니다. – KernelPanic

+1

'ident'를 휘발성으로 만들 필요는 없습니다. 'LIS3DSH_WHOAMI_REG_ADDR' o.t.o.h는 휘발성이어야합니다. 'LIS3DSH_Read'는 어떻게 정의되어 있습니까? 함수 또는 매크로? –

+0

물론, 좋은 질문입니다. 때로는 최적화를 통해 컴파일러가 비교시 모서리를 잘라내어 캐스팅이 한 번 내 문제가되었습니다. 최적화를 계속할 수 있습니다. 주의를 기울이십시오. – bunkerdive

1

함수

failureHandler() 

처리 : 여기 상태의 스크린 샷이다? 그렇지 않으면 컴파일러 최적화로 인해 디버거보기가 혼란 스럽습니다. 최적화 된 코드는 좋은 사례와 실패 사례 모두에 공통 "반환"코드를 사용합니다. 디버거는 장애 경로의 "종료"에서 멈추는 경우가 있습니다 ( ).

+0

예, failureHandler()가 처리되고 주황색 led가 깜박입니다. 그리고 모든 최적화가 비활성화되었습니다. – KernelPanic

+0

이상한. "ident"값을 변경할 수있는 인터럽트 루틴이 있습니까? 어쩌면 "ident"테스트 후에 "ident"값이 0x3F가됩니다 (!). (단지 야생 추측 ;-)) – Habi

+0

아마도 ident 변수를 volatile로 선언해야합니다 ... – KernelPanic