メインコンテンツ

Atomic サブシステムのコードの生成

この例では、複数の Atomic サブシステムに分割されたモデルから生成された組み込みシステム コンポーネント コードを展開するために設計および構成されたモデルを示します。サブシステムは異なるレートで実行されます。C データ インターフェイス コード生成用にマルチレート最上位モデルが構成されます。各サブシステムに対して生成されたソース コードを、ターゲット環境で実行される外部スケジューラなどの他のコードと統合します。

Atomic サブシステム モデル

モデル例を開きます。

open_system("AtomicSubsystem");

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

このモデルは、アルゴリズムを Rate1sRate2s の 2 つの Atomic サブシステムに分割します。サブシステム Rate1s は、サンプル時間 1 秒で構成されています。サブシステム Rate2s は、サンプル時間 2 秒で構成されています。

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

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

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

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

スケジューリング

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

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

レートモノトニック スケジューリングに基づいて、アプリケーション コード (実行フレームワーク) は、サブシステム Rate2sRate1s の間でデータを転送する必要があります。頻度は 2 秒と 1 秒で、1 秒の方が優先されます。つまり、生成された関数は、サブシステム Rate1s のコードを実行する前に、1 回おきに 1 秒のタスクでデータを転送します。

実行フレームワークは生成された関数コードをスケジュールし、その間のデータ転送を処理しなければなりません。生成されたコードがスケジューリングやデータ転送のセマンティクスを仮定しないため、これはマルチレート モデルにとって利点となります。ただし、実行フレームワークはデータ転送を明示的に処理する必要があります。

コードとレポートの生成

サブシステム間の接続なしに、サブシステムごとに単一の呼び出し可能な関数を生成します。サブシステムのコードを生成するには、サブシステムのコンテキスト メニューなど複数の方法があります。

  1. Embedded Coder アプリを開きます。

  2. Subsystem ブロックを右クリックします。

  3. [C/C++ コード]、[このサブシステムをビルド] をクリックします。

モデル例がレポートを生成します。

生成コードのレビュー

[コード] ビューまたはコード生成レポートで、生成されたコードを確認します。

  • ert_main.c はサブシステム用のメイン プログラム (実行フレームワーク) の例である。このコードは、エントリポイント関数 Rate1s_step または Rate2s_step を呼び出してモデルのコード実行を制御します。このファイルを、実行フレームワークのコーディングの開始点として使用します。

  • Rate1s.cRate2s.c には、それぞれサブシステム Rate1sRate2s を実装するコードのエントリ ポイントが含まれている。このファイルには、レートとタスクのスケジューリング コードが含まれています。

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

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

コード インターフェイス

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

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

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

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

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

入力端子 (Rate1s):

  • 次元 1 の real_T 型の rtU.In1

  • 次元 1 の real_T 型の rtU.In2

エントリポイント関数 (Rate1s):

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

  • 出力および更新エントリポイント (ステップ) 関数 void Rate1s_step(void)。この関数を周期的に毎秒呼び出します。

  • 終了関数 void Rate1s_terminate(void)。シャットダウン コードからこの関数を一度呼び出します。

出力端子 (Rate1s):

  • 次元 1 の real_T 型の rtY.Out1

  • 次元 1 の real_T 型の rtY.Out2

入力端子 (Rate2s):

  • 次元 1 の real_T 型の rtU.In1

エントリポイント関数 (Rate2s):

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

  • 出力および更新エントリポイント (ステップ) void Rate2s_step(void)。この関数を 2 秒ごとに定期的に呼び出します。

  • 終了関数 void Rate2s_terminate(void)。シャットダウン コードからこの関数を一度呼び出します。

出力端子 (Rate2s):

  • 次元 1 の real_T 型の rtY.Out1

詳細