Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Task Sync

下流の Function-Call Subsystem または Stateflow チャートのコードを、RTOS 例 (VxWorks) のタスクを発生させることによって実行する

  • ライブラリ:
  • Simulink Coder / Asynchronous / Interrupt Templates

  • Task Sync block

説明

Task Sync ブロックは Function-Call Subsystem または Stateflow® チャートを呼び出す RTOS 例 (VxWorks) タスクを発生させます。通常 Task Sync ブロックは Async Interrupt ブロックと Function-Call Subsystem ブロックまたは Stateflow チャートの間に配置します。または、Task Sync ブロックの接続先を、関数呼び出しとして構成されたイベント Output to Simulink が含まれる Stateflow ブロック線図の出力端子にすることもできます。

Task Sync ブロックの動作は以下のとおりです。

  • RTOS (VxWorks) システム呼び出し taskSpawn を使用して独立したタスクを発生させます。タスクがアクティブになると下流の Function-Call Subsystem コードまたは Stateflow チャートを呼び出します。ブロックはモデルの終了時に taskDelete を呼び出してタスクを削除します。

  • 接続されたサブシステムをブロックの実行と同期させるセマフォを作成します。

  • 発生したタスクを無限 for ループでラップします。ループでは発生したタスクが semTake を使用してセマフォをリッスンします。semTake への最初の呼び出しでは NO_WAIT が指定されます。この設定により、Function-Call Subsystem またはチャートが完了する前に 2 番目の semGive が発生したかどうかがタスクで判断されます。このシーケンスは割り込みレートが速すぎるか、タスクの優先順位が低すぎることを示します。

  • 同期コード (たとえば semGive()) を生成します。このコードによって発生したタスクが実行されます。次にタスクは接続された Function-Call Subsystem コードを呼び出します。同期コードは割り込みレベルで実行できます。Async Interrupt ブロックと Task Sync ブロックの間の接続によってこの動作が達成され、ISR 内で Task Sync ブロックの実行がトリガーされます。

  • 下流のアルゴリズム コードのブロックに必要な場合は絶対時間を提供します。絶対時間は Async Interrupt ブロックによって維持されるタイマー、または Task Sync ブロックに関連付けられたタスクによって維持される独立したタイマーのいずれかから提供されます。

アプリケーションの設計時に、Task Sync ブロックに接続される下流の Function-Call Subsystem のためにタイマーおよび信号入力値をいつ取得するかを検討してください。既定の設定では RTOS (VxWorks) がタスクをアクティブにするときに時間および入力データが読み取られます。この場合、データ (入力および時間) はタスクに同期します。[このタスクのデータ転送を呼び出し側タスクと同期] オプションを選択し、Task Sync ブロックのドライバーが Async Interrupt ブロックである場合は、割り込みが発生したときに (つまり ISR 内で) 時間および入力データが読み取られます。この場合、データは Task Sync ブロックの呼び出し元と同期されます。

メモ

このブロックは vxlib1 ライブラリ (Async InterruptTask Sync) でシミュレーションとコード生成に使用できます。これらのブロックは、ターゲット環境でカスタム ブロックを開発するのに役立つ開始点の例を提供します。

端子

入力

すべて展開する

Async Interrupt ブロックからの呼び出し。

出力引数

すべて展開する

Function-Call Subsystem への呼び出し。

パラメーター

すべて展開する

RTOS で taskSpawn システム呼び出しに渡される最初の引数。RTOS (VxWorks) は、タスク関数名としてこの名前を使用します。この名前はデバッギング エイドとしても機能します。ルーチンではこのタスク名を使用して呼び出し元のタスクを識別します。

発生時に Function-Call Subsystem に割り当てられる RTOS タスクの優先順位。RTOS (VxWorks) の優先順位の範囲は 0 ~ 255 で、0 は最も高い優先度を表します。

メモ

Simulink® ソフトウェアは非同期タスクの動作をシミュレーションしません。非同期タスクの優先順位はコード生成専用であり、シミュレーション時には使用されません。

タスクのスタックを拡張できる最大サイズ。スタック サイズは RTOS (VxWorks) がタスクを発生させるときに割り当てられます。タスク内のローカル変数の数に基づいてスタック サイズを選択します。タスクの生成コード (および生成コードから呼び出される関数) を調べてサイズを決定します。

選択しなかった場合 (既定値)、次のようになります。

  • ブロックは下流のブロックの計算に必要な絶対時間値を提供するタイマーを維持します。このタイマーは Task Sync ブロックを呼び出す Async Interrupt ブロックによって維持されるタイマーから独立しています。

  • [タイマー分解能] オプションが表示されます。

  • [Timer size] オプションは時間カウンターのワード サイズを指定します。

選択した場合、次のようになります。

  • ブロックは独立したタイマーを維持せず、[タイマー分解能] フィールドも表示されません。

  • タイマーが必要な下流のブロックは Task Sync ブロックを呼び出す Async Interrupt ブロックによって維持されるタイマーを使用します (非同期タスクにおけるタイマーを参照)。タイマーの値は非同期割り込みを処理するときに読み取られます。Task Sync ブロックによって呼び出されるブロックへのデータ転送は、Async Interrupt ブロックに関連付けられたタスク内で実行されます。したがって、データ転送が呼び出し側と同期されます。

秒単位のブロックのタイマーの分解能。このオプションは [このタスクのデータ転送を呼び出し側タスクと同期] が選択されていない場合にのみ表示されます。既定の設定ではブロックは RTOS (VxWorks) の関数 tickGet を呼び出すことによってタイマーの値を取得します。既定の分解能は 1/60 秒です。

ハードウェア タイマーの時間刻みを保存するためのビット数。サイズは [32bits] (既定の設定)、[16bits][8bits][auto] から選択できます。[auto] を選択した場合、コード ジェネレーターは [アプリケーションのライフスパン (日)] および [タイマー分解能] の設定に基づいてタイマー サイズを決定します。

既定の設定ではタイマーの値は 32 ビット整数として保存されます。[Timer size][auto] に設定した場合は [アプリケーションのライフスパン (日)] オプションを設定することによってカウンターのワード サイズを間接的に制御できます。[アプリケーションのライフスパン (日)] に設定した値がコード ジェネレーターには大きすぎて指定した分解能の 32 ビット整数として処理できない場合、コード ジェネレーターはオーバーフローに対処するために 2 番目の 32 ビット整数を使用します。

詳細については、時間カウンターに対するメモリの割り当ての制御を参照してください。非同期タスクにおけるタイマーも参照してください。

R2006a で導入