3

2 つ以上のマイクロコントローラーのネットワークを介した同期のアルゴリズムについて議論する方法として、この質問を使用したいと思います。

今日の午後、2 つの異なるマイクロコントローラーでデータを交換し、実行を同期させて、同時に作業を開始し、ほぼ同時に終了するという問題について考え始めました。これは、実行しているコードが正しく、おそらくメモリにエラーがないことを保証する方法です (ご想像のとおり、両方のマイクロコントローラーでまったく同じエラーが発生する可能性は非常に低いです)。

マイクロコントローラー 1 のタイムスタンプを含むメッセージを送信するだけで、2 番目のマイクロコントローラーがそれを受信し、それを自身のタイムスタンプと比較してから、マイクロコントローラー 1 に再送信することを考えました。

その時点で、両者は同じコードの実行を開始し、最後に同期して、互いに結果を交換し、何か問題があるか、またはすべてが正常に機能しているかどうかという結論に達します。

これは、両方のマイクロコントローラー間で実行の同期を実現するための「まともな」方法だと思いましたが、これを行うためのより適切でスマートな方法があるかもしれないという頭から離れることはできません。

これは 2 つのマイクロコントローラーで問題なく動作する可能性がありますが、より多くのマイクロコントローラーで実行したい場合はどうなりますか? 前に説明した方法で 5 コア システム (たとえば 5 arm9 コア) を実装したい場合はどうすればよいでしょうか。これがいくつかのマイクロコントローラーで機能しているとは思いません。すべてのマイクロコントローラが異なる作業を行う 5 コア システムを実装したいと思っていたとしても、そうではありません (すべての場合において、同期が可能な限り最善である必要があると思います ....複数のコアが必要になったことがないことを本当に知りません、しかし、私はこれからそれをする必要があります)

編集:

この質問は、2 つ以上のマイクロコントローラーのネットワークまたは同じボード上での同期のアルゴリズムを理解する方法として使用したいと思います。

今日の午後、2 つの異なるマイクロコントローラーでデータを交換し、実行を同期させて、同時に作業を開始し、ほぼ同時に終了するという問題について考え始めました。これは、実行しているコードが正しく、おそらくメモリにエラーがないことを保証する方法です (ご想像のとおり、両方のマイクロコントローラーでまったく同じエラーが発生する可能性は非常に低いです)。

マイクロコントローラー 1 のタイムスタンプを含むメッセージを送信するだけで、2 番目のマイクロコントローラーがそれを受信し、それを自身のタイムスタンプと比較してから、マイクロコントローラー 1 に再送信することを考えました。

その時点で、両者は同じコードの実行を開始し、最後に同期して、互いに結果を交換し、何か問題があるか、またはすべてが正常に機能しているかどうかという結論に達します。

これは、両方のマイクロコントローラー間で実行の同期を実現するための「まともな」方法だと思いましたが、これを行うためのより適切でスマートな方法があるかもしれないという頭から離れることはできません。

4

2 に答える 2

2

これを行うには、システムをどのようにカスタマイズしたいか、および実行する必要がある精度に応じて、いくつかの方法があります。

ただし、タイムスタンプが前後に送信されているため、正しい軌道に乗っています。このようなローカル同期を行う「標準的な」方法は、Precision Time Protocol (PTP / IEEE 1588)であり、実装によってはマイクロ秒の精度まで機能します (ネットワーク タイム プロトコル (NTP ) とは対照的に、長時間の同期に適しています)。 -距離同期であり、通常、ミリ秒範囲よりも優れた同期を達成することはできません)。

マイクロコントローラーでイーサネットまたは同様のものが実行されている Linux システムを使用している場合は、PTPDを確認できます。または、自分で何かを実装したい場合は、PTP (およびおそらく NTP) アルゴリズムを見て、インスピレーションを得てください。

于 2013-03-14T22:27:52.343 に答える
2

2 つ以上のプロセッサが同じタスクを実行し、結果が比較されるシステムが確かに存在します。私は、同じ結果を生成する 2 つのシステムを備えた自動列車制御装置を知っています。システムの 1 つが同じ結果を生成しない場合、非常ブレーキが「引き出され」、運転手が「気付くまで」列車は停止します。コンピューターが正しく動作していません」ボタン。2 つのシステムには、2 組の異なる開発者によって書かれたソフトウェアがあり、「よくあるエラーは、この方法で解決する必要があると考えたため」回避するために、ソリューションの実装方法に関する情報を共有していません。

飛行機の電子機器は通常、奇数と「多数決」を使用して、異なるシステムからの複数の回答から選択します。飛行機で「停止」するのは悪い考えです。繰り返しになりますが、システムはさまざまなソフトウェアを使用しており、多くの場合、プロセッサや言語などのさまざまなサプライヤーも使用しています。そのため、1 つのシステムは C または C++ で記述され、別のシステムは Java で記述され、3 つ目のシステムは [例として] Pascal または ADA で記述されています。プロセッサ、言語、またはコンパイラのバグにより、システム内のすべてが「うまくいかない」ことになります。

x86 を使用した以前の仕事から、「バックアップ プロセッサをロックステップで実行する」ことを希望し、I/O を追加した変更されたコンパイラを使用する必要があったお客様のために、かなり詳細に調査しました。コードの決定ポイント [分岐、呼び出し、リターンなど] での命令、およびプロセッサが実際に同期していることを確認するための外部ハードウェア]。したがって、そのようなARMを含む最新のプロセッサには、プロセッサ内にかなり「予測不可能」な「賢いもの」が十分にあるため、2つのプロセッサを互いに正確にロックステップで実行することはほとんど不可能です。確かに、時間を正確に測定しない限り、「同じタスクを同じ時間で実行する」ものを取得できます。

スーパースカラー実行ユニット、非同期割り込み、非同期 (っぽい) メモリ コントローラー、キャッシュ、キャッシュの内容はすべて、1 つのプロセッサを他のプロセッサよりも少しだけ速くまたは遅く実行するために共謀します。

したがって、システムを「同期」させる精度には限界があります。

ネットワーク タイム プロトコル (NTP) には、複数のシステム間で時間を設定/同期するための非常に巧妙なアルゴリズムがいくつかあります。これにより、複数のシステムが同じ「時間」の概念を持つことができます。しかし、繰り返しますが、「同一性」には限界があることを心に留めておいてください。おそらく数マイクロ秒です。

したがって、「同時に開始」できるかどうかは、「同時に」が何を意味するかによって異なります。マイクロ秒かミリ秒か?もしそうなら、ほぼ間違いなく可能です。クロックサイクルを意味する場合は、おそらくそうではありません。

于 2013-03-14T21:32:00.327 に答える