メインコンテンツ

シングルコア、シングルタスク アプリケーションのモデル化

この例では、シングルコア、シングルタスクのターゲット環境でアプリケーションとして実行するための組み込みシステム コードを生成するように設計および構成されたモデルを示します。アプリケーション アルゴリズムは、C データ インターフェイス コード生成用に構成されたマルチレート最上位モデルとして取得されます。

シングルタスク実行用に設定された周期的なマルチレート モデル

モデル例を開きます。

open_system('MultirateSingleTasking');

このモデルは注釈付きの色分けされたサンプル時間を表示するように設定されています。表示するには、モデルを開いた後に、"Ctrl+D" を押してブロック線図を更新します。凡例を表示するには、"Ctrl+J" を押します。

  • Inport ブロック In1_1s および In2_2s のサンプル時間は、それぞれ 1 秒と 2 秒に設定されています。

  • レートを明確に分割するため、サブシステム SS1 および SS2 のサンプル時間は 1 に設定されています。

関連のモデル コンフィギュレーション パラメーター設定

  • [タイプ]Fixed-step に設定されている。

  • [ソルバー]discrete (no continuous states) に設定されている。

  • [各離散レートを個別のタスクとして扱う] がオフになっている。

スケジューリング

Simulink® はモデル コンフィギュレーションに基づいてモデルをシミュレーションします。モデルから生成されたコードは、同じ実行セマンティクスを実装します。Simulink では、Inport ブロックのサンプル時間を伝播して使用し、シングルコア、シングルタスクの実行プラットフォームに基づいてブロック実行を順序付けます。

このモデルでは、サンプル時間の凡例に暗黙的なレートのグループ分けが示されます。赤色は最も速い離散レートを表します。緑色は 2 番目に速い離散レートを表します。

生成されたコードはモデルでサブレートをスケジュールします。この例では、Inport ブロック In2_2s のレート (緑色のレート) がサブレートです。生成されたコードは、さまざまなレートで実行されるタスク間でデータを適切に転送します。

暗黙的なレートのグループ分けの利点:

  • Simulink によってモデルにアーキテクチャ上の制約が課されません。

  • 実行フレームワークでは、基となる関数のスケジューリングやレート間のデータ転送の詳細は必要ありません。したがって、モデル インターフェイスの要件が簡素化されます。実行フレームワークは、生成されたインターフェイス コードを使用して入力の書き込み、モデルのステップ関数の呼び出し、および出力の読み取りを行います。

  • コード ジェネレーターにより、シングルタスク実行セマンティクスに基づいて、レート間でコードが最適化されます。

実行フレームワークは、モデルの入力を読み書きするために外部デバイスと通信できます。たとえば、Simulink S-Function ブロックを使用して外部デバイスをモデル化します。アルゴリズムの残りと共に、これらのブロックのコードを生成します。

コードとレポートの生成

Embedded Coder アプリを開きます。次に、コードとコード生成レポートを生成します。モデル例がレポートを生成します。

生成コードのレビュー

コード生成レポートで生成されたコードをレビューします。

  • ert_main.c はモデル用の main プログラムの例 (実行フレームワーク) を示す。このコードは、エントリポイント関数 MultirateSingleTasking_step を呼び出してモデルのコード実行を制御します。このファイルを、実行フレームワークのコーディングの開始点として使用します。

  • MultirateSingleTasking.c には、モデルのアルゴリズムを実装するコードのエントリ ポイントが含まれる。このファイルには、レート スケジューリング コードが含まれています。

  • MultirateSingleTasking.h は、モデル データ構造体と、モデル エントリ ポイントおよびデータ構造体へのパブリック インターフェイスを宣言する。

  • rtwtypes.h は、生成コードが必要とするデータ型、構造体およびマクロを定義する。

コード インターフェイス

コード インターフェイス レポートを開いてレビューします。このレポートの情報を使用して、実行フレームワークのインターフェイス コードを記述します。

  1. 命令 #include MultirateSingleTasking.h を追加することによって、生成されたヘッダー ファイルをインクルードします。

  2. モデルの Inport ブロックの生成コードへの入力データを記述します。

  3. 生成されたエントリポイント関数を呼び出します。

  4. モデルの Outport ブロックの生成コードからデータを読み取ります。

入力端子:

  • rtU.In1_1s: データ型 real_T、次元 1

  • rtU.In2_2s: データ型 real_T、次元 1

エントリポイント関数:

  • 初期化エントリポイント関数 void MultirateSingleTasking_initialize(void)。開始時にこの関数を一度呼び出します。

  • 出力および更新エントリポイント (ステップ) 関数 void rMultirateSingleTasking_step(void)。この関数を、モデルの最速レートで定期的に呼び出します。このモデルでは、関数を毎秒呼び出します。リアルタイムの実行を実現するには、この関数をタイマーに接続します。

出力端子:

  • rtY.Out1: データ型 real_T、次元 1

  • rtY.Out2: データ型 real_T、次元 1

詳細