マルチタスク実行のモデル化
マルチタスク モードと疑似マルチタスク モード
マルチタスク モードで周期的タスクを実行すると、既定の設定では、サンプル レートが最も速いブロックは優先度が最も高いタスクによって実行され、サンプル レートが 2 番目のブロックは優先度が 2 番目のタスクによって実行され、以降同様に繰り返されます。優先度が低いタスクは、優先度が高い複数のタスクの処理の間に処理されます。このように、効率的にプログラムが実行されます。
タスクが周期的ではなく非同期の場合、サンプル レートとタスクの優先度に必ずしも関係性はなく、優先度が最も高いタスクのサンプル レートが最も速いとは限りません。非同期タスクの優先順位を指定するには、Async Interrupt ブロックと Task Sync ブロックを使用します。優先度の数字の意味を切り替えるには、モデル コンフィギュレーション パラメーター [優先順位の値が高いほどタスクの優先順位が高いことを示す] を選択または選択解除します。
マルチタスク環境 (すなわち、リアルタイム オペレーティング システムを使用している環境) では、個々のタスクを定義して、優先度を割り当てることができます。ベアメタル ターゲット ハードウェア (すなわち、リアルタイム オペレーティング システム以外のシステムを使用している環境) では、個別のタスクを作成することはできません。ただし、生成されたアプリケーション モジュールでは、割り込みのオーバーラップとプログラムによるコンテキスト スイッチを使用する効果的なマルチタスクの実行スキームを実装します。
すなわち、ある割り込みの処理中に別の割り込みが発生する場合があるということです。この場合、現在の割り込みがプリエンプトされ、浮動小数点演算装置 (FPU) のコンテキストが保存されます。優先度の高い割り込みが、優先度の高い (つまり、より高速のサンプル レートの) コードを実行します。割り込みが完了すると、プリエンプトされた ISR に制御権が戻ります。
次の図は、マルチタスク、疑似マルチタスクおよびシングルタスク環境でコード ジェネレーターによってマルチレート システムのタスクのタイミングが処理される様子を示したものです。
次の図は、割り込みのオーバーラップによる疑似マルチタスクの実装を示したものです。この場合、割り込み 0 は、割り込み 1、2、および 3 が完了するまで返されません。
マルチタスク実行のためのプログラムのビルド
マルチタスク実行を使用するには、モデル コンフィギュレーション パラメーター [各離散レートを個別のタスクとして扱う] を選択します。このパラメーターは、[ソルバー タイプ] を [固定ステップ]
に設定した場合にのみ有効です。[自動]
モードが選択されると、モデルに 2 つ以上の異なるサンプル時間が含まれている場合、マルチタスク環境が指定されます。モデルに連続サンプル時間および離散サンプル時間が含まれ、固定ステップ サイズが離散サンプル時間と等しい場合、シングルタスク モードで実行されます。
マルチタスク モデルの実行
モデルの連続部が離散部と異なるレートで実行される場合、またはモデルが異なるサンプル レートのブロックをもつ場合、Simulink® エンジンは各ブロックに "タスク識別子" (tid
) を割り当て、ブロックとそのブロックのサンプル レートで実行するタスクとを関連付けます。
[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインでサンプル レートとその制約を設定します。コードを生成するには、ソルバー タイプに [固定ステップ]
を選択します。使用できるサンプル レートには一定の制約があります。
ブロックのサンプルレートは、基準の (つまり最も速い) サンプル期間の整数倍でなければなりません。
モデル コンフィギュレーション パラメーター [周期的なサンプル時間の制約] を
[制約なし]
に設定すると、ベース サンプル期間はパラメーター [固定ステップ サイズ] の設定で決定されます。パラメーター [周期的なサンプル時間の制約] を
[サンプル時間を制約する]
に設定すると、基本レートの固定ステップ サイズはパラメーター [サンプル時間のプロパティ] で指定するサンプル時間行列の最初の要素になります。モデル例rtwdemo_mrmtbb
の [ソルバー] ペインに例を示します。連続ブロックは基本サンプルレートで実行する積分アルゴリズムを使用して実行します。モデル コンフィギュレーション パラメーター [周期的なサンプル時間の制約] を
[制約なし]
に、パラメーター [固定ステップ サイズ] を[自動]
に設定した場合にのみ、ベース サンプル期間はモデルのレートの最大公約数です。モデルの連続部と離散部が異なるレートで実行できるのは、離散部のレートが連続部のレートと同じかそれより遅く、基本サンプル レートの整数倍である場合のみです。
マルチタスク実行
この例では、リアル タイムおよびシミュレーションにおける固定ステップ ソルバーを使用した単純なマルチレート モデルの実行について説明します。モデル コンフィギュレーション パラメーター [各離散レートを個別のタスクとして扱う] を設定することで決定される、シングルタスク モードとマルチタスク モード両方の操作が考慮されます。
モデルの例を次の図に示します。ブロック線図のラベルに従い、モデルの A から F までの 6 つのブロックについて説明します。
ブロックの実行順序 (各ブロックの右上に表示) は、ブロック F、E、および D に高い優先度が割り当てられていることが強制的に示されています。示された順序は、このモデルで考えられる有効な実行順序の 1 つです。詳細については、動的システムのシミュレーションの段階を参照してください。
実行順序は、ブロック間のデータ依存関係によって決定します。リアルタイム システムでは、実行順序によって、指定した時間間隔またはタスク内でブロックが実行される順序が決定されます。この説明では、モデルの実行順序は、タスクに対するブロックの計算の割り当てやタスク実行のスケジューリングに関連付けられているため、既知の順序として扱います。
メモ:
この節の説明とタイミング図は、Rate Transition ブロックが既定の設定 (保護) モードで使用されているという前提に基づいています。すなわち、ブロック パラメーター [データ転送中の整合性を確保] と [確定的にデータ転送を確保 (最大遅延)] は選択されています。
この例では、モデル コンフィギュレーション パラメーター [タスク モード] が [マルチタスキング]
に設定される場合に前述のモデルの実行を検討します。ブロック計算は、レートで優先度が指定され、2 つのタスクで実行されます。
より低速のタスクは、優先度が低く、毎秒実行されるようにスケジュールされます。これを "1 秒タスク" といいます。
より高速のタスクは、優先度が高く、毎秒 10 回実行されるようにスケジュールされます。これを "0.1 秒タスク" といいます。0.1 秒タスクは、1 秒タスクをプリエンプトする場合があります。
次の表に、モデルの各ブロックについて、実行順序、ブロック実行時のタスク、およびブロックに計算の出力または更新が含まれているかどうかを示します。ブロック A および B は、離散状態が存在しないため、更新の計算は含まれません。
マルチタスク実行時のブロックのタスク割り当て
ブロック | タスク | 出力 | 更新 |
---|---|---|---|
E | 0.1 秒タスク | Y | Y |
F | 0.1 秒タスク | Y | Y |
D | Rate Transition ブロックは、端子ベースのサンプル時間を使用します。 | Y | Y |
A | 0.1 秒タスク | Y | N |
B | Rate Transition ブロックは、端子ベースのサンプル時間を使用します。 | Y | N |
C | 1 秒タスク | Y | Y |
リアルタイム マルチタスク実行
次の図は、生成コードがリアルタイム システムに展開されたときの [マルチタスク]
ソルバー モードの計算のスケジューリングを示しています。生成プログラムは、10 Hz タイマーからの割り込みを制御しながら、2 つのタスクをリアル タイムで実行中です。
マルチタスク実行のシミュレーション
次の図は、同じモデルの [マルチタスク]
ソルバー モードのSimulink 実行を示しています。この場合、Simulink エンジンは、マルチタスクをシミュレートして、1 つの実行のスレッドでブロックを実行します。プリエンプションは発生しません。