2017-10-24 6 views
0

プロセッサの温度を読み取るi2c温度モジュールを持つデバイスがあります。 i2cから温度値を読み取り、それをユーザーに提示します。このprintfは、i2cプロセスとまったく関係のない機能の中にあります。私たちは、I2Cから読み取るこのprintf値の終わりから1感嘆符を削除すると、今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度前後)が、我々はコンパイルした場合に2感嘆符で実行します。これは、関数であります、i2cは常にFFFF(16ビット整数の最大値)を読み込みます。私は何が起こっているのかわからないが、我々が試した

  • stringの終わりまでに"\n"を置く他の機能(疑いのヒープサイズの問題)
  • からいくつかのprintfの呼び出しを無効にしますそれは我々が機能しないだろうと思ったと
(途中などにそれを置く、機能の周り printfコールを動かすように)なかった
  • 他のものを閉じていますことを確認してください

    この関数は、他のスレッドが入っている無限ループを停止し、その後にメインスレッドを終了させます。それで、プログラムが回復できない問題に遭遇したときだけ、これが呼び出されます。この関数が呼び出された場合は、とにかくi2cからの値の読み取りを見ることができません。

    また、私たちは技術的にこの問題に遭遇することはありませんが、これは修正ではありません。ハックジョブです。だから私は実際の解決策を探しています。

    これはまだヒープサイズの問題(プログラム内で他のprintf呼び出しを削除したとしても)ですか?もっと長い文字列サイズでこの作業をしようとする可能性のあるものは何ですか?

  • 答えて

    0

    これはおそらくタイミングの問題であり、異なるプラットフォーム上の異なるI2Cハードウェア実装によるものです。ソフトウェアのバグに加えて、I2Cのマスタとスレーブが適時に応答しなければならないことに注意してください。これは、printf()が少し遅れて同期の問題を引き起こしているようです。他端が十分に速く応答しない場合に起こります。 printf()によって引き起こされる遅延は、中止されたメッセージや不正なデータにつながる可能性があります。 0xFFFFの値を読むことは、スレーブが応答しないときに通常得られるものです。スレーブが何も送信しないとき、バスはハイにフロートします。実際のread()操作の戻り状態を低レベルでチェックしたり、オシロスコープまたはロジックアナライザを使用して問題の一部を検出できるはずです。

    +0

    これは意味がありますが、決して(プログラムがシャットダウンしているときを除いて) 'printf()'関数は使用されません。したがって、実際にプログラムに遅延が導入されるべきではありません。 –

    関連する問題