Main Content

外部コード統合ワークフローの選択

通常、ソフトウェア プロジェクトでは複数のソースのコードを結合します。コード生成アプリケーションの一般的なシステム構造は、外部コードや Simulink® モデルから生成されるコードを含む、複数のソースからのコードを結合するフレームワークで構成されています。

以下の図は、既存のハードウェア デバイスのドライバー コードの統合を必要とするアプリケーションを示しています。コアのソフトウェア アルゴリズムとロジックは、Simulink 環境に統合されている外部の再利用可能なアルゴリズムのコード モジュールと、モデル設計全体の一部として生成されたコードの組み合わせにすることができます。

以下のタスクを実行すると、外部コード統合ワークフローと、プロジェクトに合わせたツールを選択するのに役立ちます。

タスクアクション詳細
1アプリケーションを分割し、アルゴリズムをコンポーネントにマッピングして、統合ポイントを特定します。

Software Deployment ConceptsDecompose Software ProblemおよびMap Embedded System Architecture to Simulink Modeling Environment

2コード ジェネレーターで生成されるスケジューリング コードに依存できるかどうか、または生成されたコードをランタイム環境に固有のスケジューリング メカニズムに統合しなければならないかどうかを確認します。コード実行をスケジュールするソフトウェア実行フレームワークの選択
3インポートしている外部コードの特性を評価します。外部コードの特性の評価
4統合に最適なツールを選択するのに役立つ統合要件を特定します。統合要件の特定
5タスク 1 ~ 4 の結果に基づいて、ワークフローを選択します。ワークフローの選択

コード実行をスケジュールするソフトウェア実行フレームワークの選択

コード ジェネレーターは、2 つのタイプのソフトウェア実行フレームワーク (単一の最上位モデルと複数の最上位モデル) をサポートします。回答すべき最初の質問は、2 つのフレームワークのどちらが、製品のスケジューリングやその他のニーズを満たすかです。たとえば、外部コードは単一のレートベースの最上位モデルにインポートできます。単一の最上位モデルまたは複数の最上位モデルからコードをエクスポートしてカスタム (外部) のスケジューリング メカニズムと統合できます。

  • 単一の最上位モデル

    外部コードと Simulink C/C++ コード ジェネレーターが生成するコードからの 1 組のアプリケーション コード ファイルを生成します。生成されたコードにはスケジューラが含まれます。この場合は、コードを Simulink コード生成環境に "インポート" します。

  • 単一の最上位モデルまたは複数の最上位モデル

    コード ジェネレーターがモデル コンポーネントから生成する C または C++ コードを外部のアプリケーション コードおよび外部スケジューラと統合します。Simulink コード生成環境から生成コードを "エクスポート" します。

外部デバイス ドライバー コードへの呼び出しをモデルにインポートし、エクスポート用にそのモデルのコードを生成するには、コードのエクスポートとインポートを行います。

目的と要件に基づいて、外部コードの統合がさまざまな方法で特徴付けられ、次の異なるワークフローおよび統合ツールが必要になります。

  • 既存の外部コードを生成コードにインポートする。

    • シミュレーションおよびコード生成のために再利用可能な外部アルゴリズム コードを呼び出す。

    • 生成コードに外部 C/C++ コードを配置する。

    • 外部デバイス ドライバーを呼び出す。

    • 関数および演算子のコード置換を適用する。

    • 外部のタイマー割り込みまたはスケジューラと連動させる。

    • 特定のランタイム環境用に置換コードを生成する。

  • 外部のコード ベースに含めるために生成コードをエクスポートする。Embedded Coder® が必要です。

    • エクスポート用のコンポーネント ソース コードを生成する。

    • エクスポート用の共有ライブラリを生成する。

    生成されたコードのエクスポートの詳細については、呼び出し可能な関数の統合を参照してください。

次は、外部コードの特性の評価を参照してください。

外部コードの特性の評価

外部統合ワークフローを選択する前に、外部コードのこれらの特性を評価します。外部コードと連動するために、生成された C または C++ コードでは外部コードの 1 つ以上の特性を処理します。これらの特性と、モデリング、シミュレーションおよびコード生成に関する要件を理解することで、コード生成時に、統合シナリオに最適なワークフローを選択できます (統合要件の特定を参照してください)。

特性検討事項
ハードウェアへの依存

外部コードはハードウェアに依存していますか。ハードウェアに依存しないコードには、ユーティリティ関数、ルックアップ テーブル、フィルターなどがあります。

デバイス ドライバーはハードウェアと直接連動します。これらのドライバーは、ハードウェアの特性に依存します。たとえば、アナログ デジタル コンバーターのデバイス ドライバーは、データを初期化し、ハードウェアのレジスタに対して読み書きします。ハードウェアの相違と依存関係では、データ型のサイズ、エンディアン、シフト演算、コンパイラ命令、最適化された関数と演算のサポートに関係します。他のコードは、API および特定のメモリ アドレスにマッピングされているデータを使用してデバイス ドライバーと連動します。通常、開発用コンピューターでシミュレーションは実行できません。開発用コンピューターでシミュレーション中にレジスタへの読み書きを実行すると、予測できない、望ましくない結果になります。

Reusable 外部コードは再利用可能なソフトウェア モジュールですか。この例として、ユーティリティ関数、ルックアップ テーブル、フィルター、特殊な積分器、比例-積分-微分 (PID) 制御モジュールがあります。
関数呼び出し間でのデータの持続性への依存外部コードに持続データが必要ですか。たとえば、1 次フィルター関数では、その関数の前の呼び出しの出力を使用して新しい出力値を計算します。データをグローバルとして定義するか、関数のコンテキスト外の共有メモリを使用するか、というオプションがあります。
データ型指定とインターフェイス外部コードで使用するデータの複雑度はどの程度ですか。データ インターフェイスの外観はどのようなものですか。これは、引数、戻り値、グローバル変数、アクセス関数で構成されます。コードではどのデータ型を使用しますか。データ型は、基本の ANSI C 整数、浮動小数点型、整数型または浮動小数点型の配列およびこれらのデータ型へのポインターに制限されますか。インターフェイスには、構造体または構造体へのポインターが含まれますか。
固定小数点コード外部コードは、整数のみのプロセッサで実行されるように設計されていますか。そのように設計されている場合、コードは、整数のみとして表されるデータを交換および使用します。データは固定小数点のスケーリングまたはオフセットに関連付けることができます。
外部リソースへの依存外部コードは、コードの範囲外で定義されたデータ、関数またはマクロを使用しますか。たとえば、関数で標準 ANSI 関数、共有ライブラリまたは事前定義された定数を使用できます。この場合は、コンパイラとリンカーに外部リソースのパスとファイル名を通知しなければなりません。
必要な外部ソルバー高度な開発またはラピッド プロトタイピングで連続する伝達関数または一連の微分方程式を使用してシステムを記述するために外部関数を使用しますか。外部関数を使用する場合、外部コードは外部ソルバーに依存します。

次は、統合要件の特定を参照してください。

統合要件の特定

外部統合ワークフローを選択する前に、以下の統合要件を確認します。これらの要件および外部コードの特性を理解することで、統合シナリオに最適なワークフローを選択できます (外部コードの特性の評価を参照してください)。

要件検討事項
取り組み統合プロジェクトについて計画されている取り組みのレベルは、低、中、高のどれですか。
学習の取り組みプロジェクトに割り当てられた担当者のプログラミング経験はどの程度ですか。この担当者は、Simulink および MathWorks® C/C++ コード生成製品についてどの程度の経験がありますか。
シミュレーションとコード生成の動作モデルベース デザインを利用しますか。モデルベース デザインの利点を最大限に活用するために、コードを後で Simulink および Stateflow® シミュレーション環境で使用できるモデリング要素に変換します。こうすることで、統合コンポーネント向けにコードをシミュレートして生成できます。ソフトウェアインザループ (SIL) またはプロセッサインザループ (PIL) テストを使用して、アルゴリズムの動作がどちらの環境でも同じかどうかを検証します。
データ インターフェイスと型指定
  • モデルまたは生成コードでは、外部関数とデータを交換する必要がありますか。必要がある場合、入力、出力、パラメーターを外部関数インターフェイスにマッピングします。標準の関数インターフェイスには、関数の引数と戻り値、グローバル変数、getRPM などのアクセス関数が必要です。

  • 配列、構造体または列挙型を表しますか。Simulink 環境では、これらの型をそれぞれベクトル、バス、IntEnum として表すことができます。

  • 固定小数点のサポートは必要ですか。Simulink 固定小数点インターフェイスを使用する場合は、スケーリングしてオフセットを指定できます。

  • 外部コードで会社固有のデータ型を使用しますか。これらのデータ型を使用し、Embedded Coder ソフトウェアがある場合は、これらの外部データ型を表すエイリアス タイプを作成します。コード ジェネレーターは、生成したコードでエイリアス タイプを使用します。たとえば、エイリアス タイプを定義した後、関数プロトタイプでそのエイリアス タイプを、一時変数またはブロック出力で指定できます。

  • コードでデータを共有メモリと交換しますか。交換する場合は、メモリ区分を定義および使用します。

直接関数呼び出しモデルから C 外部コードを直接呼出しますか。C Function ブロック、C Caller ブロック、レガシ コード ツール、Stateflow 外部コード インターフェイス、チャート アクション言語などのメカニズムおよび MATLAB® Function ブロックから選択できます。
生成コードへの外部コードの挿入生成コード内での外部コードの配置を制御しますか。生成されたエントリポイント関数にコードを挿入しますか。モデル コンフィギュレーション パラメーターまたは Custom Code ブロックを使用して生成コード内にコードを配置できます。
コード生成の最適化のサポートコード ジェネレーターで生成されるコードを最適化しますか。最適化する場合、コード ジェネレーターが生成するコードを、実行効率性、ROM 効率性、RAM 効率性などのアプリケーションの目的に基づいて最適化するようモデルを構成できます。また、コード置換ライブラリを使用するオプションもあります。
必要なファイル維持するファイル数を最小にしますか。一部の外部コード統合ツールでは、シミュレーションとコード生成の定義用に別のファイルを維持する必要があります。

次は、ワークフローの選択を参照してください。

ワークフローの選択

外部コードを Simulink 環境に統合するワークフローを選択するには、詳細へのリンクが記載された次の表を使用してください。

目的アクション詳細

ハードウェアに依存しない再利用可能な外部算術コードを生成されたコードから呼び出す。例: ユーティリティ関数、ルックアップ テーブル、デジタル フィルター。

使用しているプログラミング言語や他の統合要件に基づいて、外部コードをコード生成用の Simulink 環境に統合するためのアプローチを選択します。シミュレーションおよびコード生成のための再利用可能な外部アルゴリズム コードの呼び出し
ハードウェアに依存する再利用可能な外部算術コードを生成されたコードから呼び出す。例: デバイス ドライバー。Simulink 環境から外部ドライバー コードを呼び出します。外部デバイス ドライバーの呼び出し
生成コードに外部 C/C++ コードを配置する。モデル コンフィギュレーション パラメーターまたは Custom Code ブロックを使用する外部コードをもつ関数を拡張します。生成されたコードへの外部 C/C++ コードの配置
アプリケーション コードの要件を満たすためにコード ジェネレーターが生成するコードの関数と演算子を変更します。コード置換を使用して、関数と演算子のアプリケーション固有の実装を指定します。関数および演算子のコード置換の適用

関連するトピック