3

複数のスレッドで複数の I2C デバイスを使用する例はありますか? 私は少し問題を抱えています.1ステップ実行するとすべてが機能し、フルスピードで実行するとすべてが台無しになります-明らかに競合状態です。i2C トラフィックが実際に破損している (私のロジック アナライザーで見たように) ので、少し驚きました。I2C 操作はアトミックであると想定していましたが、必ずしもそうとは限りません。

私のアプリは、温度センサーとモーター コントローラーを使用しています。どちらも I2C デバイスです。温度プローブは、ワーカー スレッドで実行されていると思われるタイマーでサンプリングされています。

I2C トラフィックのデータ破損が見られます。両方のスレッドが同時に異なるスレーブ アドレスに書き込もうとしている可能性があると思います。

ドキュメンテーションはスレッド化の問題について少し沈黙しているので、どのレベルで競合状態から保護する必要があるのか​​ わかりません. 私が見ている問題から、I2C コントローラーは一度に 1 つの操作しか実行できないように見えるため、コントローラー レベルで保護する必要があります。

これにアプローチする方法についていくつかのアイデアがありますが、ドキュメントはスレッド化の要件について少し沈黙しているので、行き止まりに行く前に、誰かがすでにそれを成功させているかどうか尋ねたいと思いました:)

4

2 に答える 2

1

I2C で操作をスケジュールするためのタイマーはありますか? このスレッドの外では、ConcurrentQueue を次のように作成します。

ConcurrentQueue<string> commandsList = new ConcurrentQueue<string>();

clinet に何かを送信する場合は、コマンドをリストに追加します。その後、I2C のループで、リストに保留中のものがあるかどうかを確認して送信します。同時に、デバイスからの読み取りを試みます。うまくいかない場合は、サンプル コードを送ってください。

于 2016-02-12T09:17:09.190 に答える
1

i2c コントローラー インスタンスの周りに基本クラス (ラッパー) を実装しました。各 i2c デバイス (アドレス) は、この基本クラスから派生します。基本クラスでは、さまざまなタスクの読み取り/書き込み呼び出しを同期するために、セマフォ (各オンボード コントローラーのシングルトン プロパティ) を追加しました。

デフォルトのドライバーで非常にうまく機能します。dmap ドライバー モデル (i2c lightning) の場合、セマフォをロック メカニズムに変更しました。残念ながら、ライトニング アクセスは、デフォルトのドライバー モデルと同じ機能を提供していないようです。または、競合状態の影響を受けやすい可能性があります。

HTHロレンゾ

于 2018-05-29T21:40:34.810 に答える