2

私はリアルタイムプログラミング/マルチスレッドにかなり慣れていないので、実用的な開発を自分のベルトの下で行おうとしています。画像処理(openCV)、Webページの提供(libmicrohttpdなどのライブラリを使用)、周辺機器とのインターフェースなど、いくつかのタスクを実行する学校プロジェクト用のプログラム(C)をコーディングしようとしています。このプログラムは、各タスクが基本的に独立して実行されるように、かなりスレッド化されます。

このプログラムの非常に中心的な部分は、イベント/データのロギングと周辺機器の時計の設定です。これには、コンピューターのオンボード時間が必要です。つまり、複数のスレッドがそのタスクの一部として現在の時刻を必要とします。だから私の質問は、グローバル時間構造体を宣言し、個々のスレッドで必要に応じてgettimeを呼び出すのが良いのか、それとも常に現在の時刻を維持する別のスレッドを持ち、すべてのスレッドがそれを読み取るのが良いのかということです。前者はアクセスの問題があるように聞こえますが、2番目は適切な頻度で更新するのが難しいようです。

私が行っているタスクのより詳細なアイデアを与えるために:

  • opencvが特定のオブジェクトを検出するたびに、時間を含む画像とテキストログを保存しています
  • 周辺機器から受信した最後の10パケットの時間を記録しています(これは非常に低いデータレートの接続です)
  • 周辺機器にはオンボードRTCがないため、このプログラムは、接続するか、離れすぎたときにRTCを設定します。

アドバイスありがとうございます。

4

2 に答える 2

3

最善のオプションは、スレッドセーフなタイムゲッターを使用することです。gettimeofdayはそのような関数の1つです(ここを参照してください:gettimeofday関数はLinuxでスレッドセーフですか?)。UNIXエポックからの秒数とマイクロ秒数が得られるため、ロギングに十分な精度が簡単に得られるはずです。内部バッファなどを備えた関数を使用しない限り、その関数から取得するデータをどのように処理するかはあなた次第です。

ログの書き込み方法にも注意する必要があります。最も安全な方法は、スレッドごとに個別のファイルを使用することですが、ミューテックスロックを使用することもできます。

于 2013-03-24T20:00:48.323 に答える
0

デバイスにRTCがないとおっしゃいました。だから私はそれが小さな組み込みプラットフォームだと思いますか?もしそうなら、ほとんどの場合、ハードウェアタイマーが利用可能なウェアがいくつかあります。その場合は、割り込みを使用するか、トレッドを使用してタイマー値をポーリングできます。また、後で評価できるように、時間調整をログに記録することを忘れないでください。

于 2013-03-24T21:00:54.627 に答える