2017-10-24 4 views
0

프로세서의 온도를 읽는 i2c 온도 모듈이있는 장치가 있습니다. 우리는 i2c에서 온도 값을 읽은 다음 사용자에게 제시합니다. 이 printf은 i2c 프로세스와 전혀 관련이없는 함수 안에 있습니다. 우리는 I2C에서 읽을이 printf 값의 끝에서 하나의 느낌표를 삭제하면, 이제I2C 모듈 값 읽기와 간섭하는 Printf

endProcessFunction(int dummy){ 
    printf("App_host: Error Handler Started!!"); 

    App_sendEvent(APP_CMD_ERROR_COND); 

    sleep(1); 

    sendIpcMsg(some_signal,2,some_thread); 

    appEndState = 1; 
    syncRunning = 0; 
    distRecRunning = 0; 
    sem_post(&distRecSem); 

    App_sendEvent(APP_CMD_APPHOST_FAIL); 
} 

정상 (섭씨 35 ° 부근)하지만 우리는 컴파일하면 두 개의 느낌표와 함께 실행 :이 기능입니다 , i2c는 항상 FFFF (16 비트 정수 최대 값)를 읽습니다. 나는 무슨 일인지 모르겠지만 우리가 시도했습니다

,

  • string의 끝에서 "\n" 퍼팅 다른 기능 (의심 힙 크기 문제)
  • 에서 일부 printf 전화를 사용하지 않도록 설정 우리가 작동하지 않을 생각
,369 (중앙 등에 넣어 함수에 주위 printf 전화를 이동 등)하지 않았다
  • 다른 물건을 닫혀 있는지 확인

    이 함수는 다른 스레드가있는 무한 루프를 중지하고 이후에 주 스레드를 종료합니다. 따라서 프로그램에서 복구 할 수없는 문제가 발생했을 때만 호출됩니다. 이 함수가 호출 된 경우 우리는 어쨌든 i2c에서 값 판독 값을 볼 수 없습니다.

    또한이 문제는 기술적으로 발생하지 않지만 수정 사항이 아니라 해킹입니다. 그래서 나는 실제 해결책을 찾고 있습니다.

    (여전히 프로그램에서 다른 printf 호출을 제거했지만) 여전히 힙 크기 문제 일 수 있습니까? 긴 문자열 크기로이 작업을 할 수있는 다른 방법은 없을까요?

  • 답변

    0

    이것은 타이밍 문제 일 수 있으며 부분적으로는 다른 플랫폼에서 다른 I2C 하드웨어 구현이 원인이기도합니다. 가능한 소프트웨어 버그 외에도, I2C 마스터와 슬레이브는 적시에 응답해야하며 printf()가 도입 한 약간의 지연으로 인해 동기화 문제가 발생하는 것처럼보아야합니다. 그것은 다른 쪽이 충분히 빨리 반응하지 않을 때 발생합니다. printf()로 인한 지연으로 인해 중단 된 메시지 나 잘못된 데이터가 발생할 수 있습니다. 0xFFFF의 값을 읽는 것은 슬레이브가 응답하지 않을 때 일반적으로 얻는 것입니다. 슬레이브가 아무 것도 보내지 않으면 버스가 높게 플로팅됩니다. 낮은 레벨에서 실제 read() 작업의 반환 상태를 확인하고 가능하면 오실로스코프 또는 로직 분석기를 사용하여 일부 문제를 감지 할 수 있어야합니다.

    +0

    이것은 이해가되지만, 프로그램을 종료 할 때를 제외하고 결코 사용할 수없는'printf()'함수가 사용됩니다. 따라서 프로그램에 실제로 지연이 없어야합니다. –