Real-Time Workshop User's Guide    

Asynchronous Bufferブロック

VxWorksAsynchronous Bufferブロックは、モデル内の信号と非同期ファンクションコールサブシステムとのインタフェースをとるために利用することを目的としています。これは、ファンクションコールサブシステムが入力または出力信号をもち、制御入力が最終的にVxWorks Asynchronous InterruptブロックまたはTask Synchronizationブロックに接続するときに必要です。

非同期ファンクションコールサブシステムが、先に実行したり、他のモデルコードによって先に実行されることが可能なので、複数の信号要素が接続されるときに不整合が発生します。問題は、ファンクションコールサブシステムに渡される、またはファンクションコールサブシステムに渡す信号が、プリエンプションが発生したときに書き込まれるか読み込まれるプロセス中であることです。そのため、部分的に古いデータや、部分的に新しいデータが用いられます。Asynchronous Bufferブロックは、ファンクションコールサブシステムとやりとりを行うデータがすべて同じ繰り返しからであることを保証するために利用されます。

Asynchronous Bufferブロックは、書き込み側が読み込み側を駆動する組として利用されます。データの完全な状態を保証するため、2つのAsynchronous Bufferブロック間でその他の接続は認められません。 ブロックの組は、2つのバッファ("double buffering")を使って信号を渡し、相互に排他的な制御を使うことによって機能し、各バッファに排他的なアクセスのみを許可します。たとえば、書き込み側がカレントで1つのバッファに書き込んでいる場合は、読み込み側は別のバッファからのみ読み込みできます。

初期のバッファは、書き込み側が別のバッファを満たす余裕がある前に読み込み側が実行される場合には、ゼロで満たされ、読み込み側は初期のバッファからゼロを収集します。

Asynchronous Bufferブロックパラメータ

Asynchronous Bufferブロックには、リーダとライタの2種類があります。下図は、Asynchronous Bufferブロックのダイアログボックスを示します。

両方のブロック共、Sample Timeパラメータが必要です。サンプル時間は、関数コール内では-1に設定され、そうでない場合は、希望する時間に設定されます。

Asynchronous Bufferブロックの例

この例は、Asynchronous Bufferブロック を使って割り込みサービスルーチン内のデータフローをどのように制御するかを示します。

ISR0 subsystemブロックは、ファンクションコールサブシステムとして設定され、Asynchronous Bufferブロックを含みます。


 Task Synchronizationブロック Rate Transitionブロック