Main Content

時間ベースのスケジューリングとコード生成

サンプル時間に関する考慮事項

Simulink® モデルは 1 つ以上のサンプル時間で実行します。Simulink 製品は、1 つを超えたサンプル時間で実行するマルチレート システムの作成にかなりの柔軟性があります。しかし、この柔軟性のために、マルチタスク環境で実行するためのリアルタイム コードをコード ジェネレーターが生成できないモデルを作成することも可能になります。マルチレート モデルを期待どおりにリアルタイムで動作させる (つまり正しい答えを得る) には、モデルを変更するか、Simulink エンジンにモデルを変更するよう指示しなければならない場合があります。一般にこの変更には、サンプル時間が異なるブロック間に Rate Transition ブロックを配置することが必要です。次の節ではマルチレート モデルをマルチタスク環境使用するために処理しなければならない課題について説明します。レート変換を含むサンプル時間の包括的な説明については、サンプル時間とはサブシステム内のサンプル時間システム内のサンプル時間レート変換の関連付けおよび関連トピックを参照してください。

タスク モード

固定ステップ モデルにはシングルタスクとマルチタスクの 2 つの実行モードがあります。これらは固定ステップ ソルバーでのみ利用できます。実行モードを選択するには、モデル コンフィギュレーション パラメーター [各離散レートを個別のタスクとして扱う] を選択します。このパラメーターを選択すると、マルチタスク実行がマルチレート モデルに適用されます。このパラメーターをオフにすると、シングルタスク実行が適用されます。

メモ

マルチレートでマルチタスクを使用しているモデルは、シングルタスクを使用しているマルチレート モデルを参照できません。

リアルタイム システムでのモデルの実行はリアルタイム オペレーティング システム下で行えます。またはモデルを割り込みサービス ルーチン (ISR) のコンテキスト内で実行する、"ベア メタル" ターゲット ハードウェア上で実行できます。

システム (Open Group UNIX® または Microsoft® Windows® システムなど) がマルチタスクであっても、プログラムがリアルタイムで実行できることを意味するわけではありません。これはプログラムが必要な場合に他のプロセスをプリエンプトしない可能性があるためです。

一定の時間に 1 つのプロセスだけが存在しうるようなオペレーティング システム (PC-DOS など) の場合、割り込みサービス ルーチン (ISR) はプロセッサ コンテキストの保存、モデル コードの実行、データの収集、プロセッサ コンテキストの復旧のステップを実行しなければなりません。

POSIX 準拠などの他のオペレーティング システムには、自動コンテキスト スイッチとタスク スケジュールの機能があります。これは ISR が実行する作業を単純化します。この場合、通常はブロックされるモデルの実行タスクを ISR が有効にします。次の図にこの違いを示します。

Comparison of program execution using an interrupt service routine (bare metal with no operating system) and program execution using a real-time operating system primitive

モデルの実行とレート変換

期待どおりにリアル タイムで実行されるコードを生成するには、ユーザー (または Simulink エンジン) がモデル内のサンプル レートの変換を識別し処理する必要があります。マルチタスク モードでは、既定の設定では、このモデルに無効なレート変換が含まれている場合、シミュレーション中に Simulink エンジンによってエラーが生成されます。モデル コンフィギュレーション パラメーター [マルチタスク データ転送] を使用してこの動作を変更できます。パラメーター [シングル タスク データ転送] は同じ目的でシングルタスク モードで使用できます。

レート変換エラーが発生しないようにするには、タスク間に Rate Transition ブロックを挿入します。Simulink エンジンが自動的にレート変換を処理するようにするには、非表示の Rate Transition ブロックを挿入します。このオプションの説明については、自動レート変換を参照してください。

このような問題を理解するには、最初に Simulink のシミュレーションとリアルタイム プログラムの相違を十分に確認する必要があります。

Simulink モデルのシミュレーションの実行

Simulink エンジンは、モデルをシミュレートする前に、位相的依存関係に基づいてブロックの順序を決めます。このとき、バーチャル サブシステムは、これらがもつ個々のブロックに展開され、モデル全体が 1 つのリストにフラット化されます。この手順が完了すると、各ブロックは指定された順序に従って実行されます。

このプロセスでは、ブロックの順序が重要です。出力がその入力に直接依存しているブロック (すなわち、直達のあるブロック) は、その入力を駆動するブロックが実行されるまで実行できません。

一部のブロックは、前のタイム ステップで取得された値に基づくか、ブロック パラメーターとして指定された初期条件によって、出力が設定されます。このようなブロックの出力は、メモリに格納されている値によって決定されるため、その入力とは関係なく更新されます。シミュレーション中、時間に対応する変数が進む前に計算が実行されます。その結果、計算は瞬時に実行されます (すなわち、計算の遅延は発生しません)。

リアルタイムでのモデルの実行

リアルタイム プログラムは、このプログラムがモデル コードをリアル タイムで同期して実行しなければならないという点において、Simulink シミュレーションと異なります。すべての計算で、若干の計算遅延が発生します。すなわち、実行が非効率になるため、サンプル間隔を短縮または延長できません (Simulink シミュレーションでは可能)。

以下のタイミングの図について検討します。

Timing diagram that shows processing inefficiency in a sample interval

サンプル間隔 t1 の処理が非効率です。定義上、サンプル時間がリアル タイムで指定されるため、この間隔を圧縮して、実行速度を上げることはできません。

この潜在的な非効率性を解消するには、マルチタスク モードを使用します。マルチタスク モードで定義されるタスクは、サンプル レートが異なるモデル コードの一部を実行するための優先度が異なります。

この処理の説明については、マルチタスク モードと疑似マルチタスク モードを参照してください。この節の内容を十分に理解してから、処理を続行してください。

シングルタスク操作とマルチタスク操作

シングルタスク プログラムでは、すべての計算が各クロック期間内に実行されなければならないため、より長いサンプル間隔を必要とします。このため、前の図が示すように、有効な CPU 時間が効率的に使用されない場合があります。

マルチタスク モードでは、モデルが大規模で、異なるレートで実行されるブロックが多い場合にプログラムの効率が改善されます。

ただし、モデルが単一レートで指定され、より遅いレートで実行されるブロックが非常に少ない場合は、マルチタスク モードを指定すると実際はパフォーマンスが低下する場合があります。このようなモデルでは、タスクの切り替え時に発生するオーバーヘッドが、より遅いレートのブロックを実行する時に必要な時間より大きくなる場合があります。このような場合、すべてのブロックを主要なレートで実行すると効率が改善します。

マルチタスクで実行した方がメリットの多いモデルでは、Rate Transition ブロックを追加してモデルを変更し (または、同様の処理が行われるように Simulink エンジンを指定し)、期待した結果を生成する必要がある場合があります。

2 つの実行モードの詳細と例については、シングルタスク実行のモデル化およびマルチタスク実行のモデル化を参照してください。

関連するトピック