Main Content

レートベース モデルからのコードの生成

モデルのテスト ハーネスではなく、レートベース モデルからコードを生成します。

レートベース モデルからコードを生成するには、次のようにします。

  1. Simulink® ツールストリップの [アプリ] タブで [Embedded Coder] をクリックします。

  2. [C コード] タブが開いたら、[ビルド] をクリックします。

レートベース モデルのコード生成レポート

レートベース モデルのコード生成レポートに、モデルのタイミングの説明があります。

コード生成レポートを開くには、[C コード] タブで [最新レポートを開く] を選択します。

次に、[コード インターフェイス レポート] をクリックして、生成コードの関数のタイミングを確認します。

Code Interface Report

レートベース モデルの生成コードのエントリ ポイント

生成コードのエントリ ポイントは、シングルタスクとマルチタスク、シングルレートとマルチレートの組み合わせで制御されます。

シングルタスクを適用するには、[各離散レートを個別のタスクとして扱う] コンフィギュレーション パラメーターをクリアします。マルチタスクを可能にするには、このパラメーターを選択します。

次の表は、ex_rate_based_model モデルの生成コードのエントリ ポイントを示しています。このモデルには、Subsystem1 および Subsystem2 という名前の 2 つの Atomic サブシステムが含まれています。

  • Subsystem1 は入力に 2 を乗算します。

  • Subsystem2 は入力に 4 を乗算します。

構成明示的にスケジュールされたレート生成されたコードのエントリ ポイント

シングルタスクまたはマルチタスク。

シングルレート。

Subsystem1Subsystem2 のサンプル時間に 0.2 が使用される。

0.2 秒ごとに周期的に呼び出される 1 つのエントリポイント関数

void ex_rate_based_model_step(void)
{
   ex_rate_based_model_Y.Out1 = 2.0 * ex_rate_based_model_U.In1;
   ex_rate_based_model_Y.Out2 = 4.0 * ex_rate_based_model_U.In2;
}

シングルタスク。

マルチレート。

Subsystem1 のサンプル時間には 0.2 が使用され、Subsystem2 のサンプル時間には 0.4 が使用される。

0.2 秒ごとに周期的に呼び出される 1 つのエントリポイント関数。

エントリポイント関数内で、カウンター (Timing.TaskCounters.TID) とレートスケジューラ関数 (rate_scheduler) によって、実行されるコードとサンプル時間が決定される。

void ex_rate_based_model_step(void)
{
   ex_rate_based_model_Y.Out1 = 2.0 * ex_rate_based_model_U.In1;
   if (ex_rate_based_model_M->Timing.TaskCounters.TID[1] == 0) {
       ex_rate_based_model_Y.Out2 = 4.0 * ex_rate_based_model_U.In2;
   }
   rate_scheduler();
}

エントリポイント関数の実行時にレートスケジューラ関数でカウンターがリセットされる。

static void rate_scheduler(void)
{
  (ex_rate_based_model_M->Timing.TaskCounters.TID[1])++;
  if ((ex_rate_based_model_M->Timing.TaskCounters.TID[1]) > 1) {
    ex_rate_based_model_M->Timing.TaskCounters.TID[1] = 0;
  }
}

マルチタスク。

マルチレート。

Subsystem1 のサンプル時間には 0.2 が使用され、Subsystem2 のサンプル時間には 0.4 が使用される。

2 つのエントリポイント関数。1 つは 0.2 秒ごとに周期的に呼び出され、もう 1 つは 0.4 秒ごとに周期的に呼び出される。

レートは優先順位が設定されたプリエンプティブ マルチタスク スキームを使用して実行される。速いレートに割り当てられる優先順位は高くなるため、先に実行される。

void ex_rate_based_model_step0(void)
{
   ex_rate_based_model_Y.Out1 = 2.0 * ex_rate_based_model_U.In1;
}

void ex_rate_based_model_step1(void)
{
   ex_rate_based_model_Y.Out2 = 4.0 * ex_rate_based_model_U.In2;
}

関連するトピック