4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Simulink/Embedded Coder のビルドプロセスをカスタマイズする (#2)

Posted at

システムターゲットファイルを用意する

システムターゲットファイルは書式が決まっているため、通常、テンプレートを利用します。組み込み向けラピッド プロトタイピング環境のテンプレートファイルは [matlabroot]¥rtw¥c¥ert¥ert.tlc です。
この ert.tlc のコピーを Target フォルダ (mytarget¥mytarget) へ「mytarget.tlc」というファイル名で保存し、編集します。

システムターゲットファイルは次の要素で構成されます。

  • ヘッダーコメント
  • TLC コンフィギュレーション変数
  • [コード生成] 起点
  • RTW_OPTIONS セクション

ヘッダーコメント

%% SYSTLC: My Custom Target Hardware  TMF: mytarget.tmf  MAKE: make_rtw

この行の内容が、システムターゲットファイル ブラウザや [コード生成] ペインで次のように反映されます。

ヘッダーコメントはファイルの先頭で記述されていなければならず、空行やコメント行であってもヘッダーコメントより上に存在してはいけません。

TLC コンフィギュレーション変数

%selectfile NULL_FILE
%assign CodeFormat = "Embedded-C"
%assign TargetType = "RT"
%assign Language   = "C"
…
%assign TargetRegistSynchroOp = 1

お約束事です。詳しくは MATLAB ドキュメンテーションの 「TLC コンフィギュレーション変数」 をご覧ください。

[コード生成] 起点

%include "codegenentry.tlc"

第1回「システムターゲットファイル 役目その2」で述べたステートメントです。説明は省きます。

codegenentry.tlc によって、model.c や model.h などのモデル関連ソースコード、Makefile、buildinfo といったビルドプロセスにおける主要なファイルが生成されます。
ですが、Makefileでインクルードするサブメイクファイル、バイナリイメージファイルを対象ハードウェアへダウンロードするバッチファイルといった、codegenentry.tlc では作られないものの、ビルドプロセスには欠かせないファイルを [コード生成] 段階で準備しなくてはならないこともあります。
そのような場合は、それらファイルを生成する「mytarget_genfiles.tlc」というファイルを作成して Target フォルダへ置き、システムターゲットファイルで次のように記述します。

mytarget.tlc
%include "codegenentry.tlc"
%include "mytarget_genfiles.tlc"

※)本ラピッドプロトタイピング環境では、サブメイクファイルやダウンロード用バッチファイルを手書き作成しますので「mytarget_genfiles.tlc」は使いません。

RTW_OPTIONS セクション

mytarget.tlc
/%
  BEGIN_RTW_OPTIONS
  <rtwoptions 構造体>
  <rtwgensettings 構造体>
  END_RTW_OPTIONS 
%/
RTW_OPTIONS セクション:rtwoptions 構造体

カスタム ラピッドプロトタイピング環境用システム ターゲット ファイル (mytarget.tlc など) を選んだ際に表示する、追加のペインとパラメータを記述します。
次のコードブロックの①がペインに、②がパラメータに該当します。

rtwoptions 構造体 ① in mytarget.tlc
  oIdx = 1;
  rtwoptions(oIdx).prompt         = 'My Target HW options';
  rtwoptions(oIdx).type           = 'Category';
  rtwoptions(oIdx).enable         = 'on';  
  rtwoptions(oIdx).default        = 1;   % ペイン内に設けるパラメータの個数
  rtwoptions(oIdx).popupstrings   = '';
  rtwoptions(oIdx).tlcvariable    = '';
  rtwoptions(oIdx).tooltip        = '';
  rtwoptions(oIdx).callback       = '';
  rtwoptions(oIdx).opencallback   = '';
  rtwoptions(oIdx).closecallback  = '';
  rtwoptions(oIdx).makevariable   = '';
rtwoptions 構造体 ② in mytarget.tlc
  oIdx = oIdx + 1;
  rtwoptions(oIdx).prompt         = 'Download to board';
  rtwoptions(oIdx).type           = 'Checkbox';
  rtwoptions(oIdx).default        = 'off';
  rtwoptions(oIdx).tlcvariable    = 'DownloadToArduino';
  rtwoptions(oIdx).makevariable   = 'DOWNLOAD_TO_ARDUINO';
  rtwoptions(oIdx).callback       = '';
  rtwoptions(oIdx).tooltip        = sprintf(['対象ハードウェアへ書き込むには、このパラメータを有効にします。']);

構造体フィールドへ設定する値は、フィールド名からおおよそ察せられると思いますので、ここでは「tlcvariable」と「makevariable」についてだけ述べます。他は MATLAB ドキュメンテーションの「rtwoptions 構造体フィールドのまとめ」をご覧ください。

tlcvariable」には、このパラメータをコマンドラインで操作する際の変数名を記述します。次は、MATLABコマンドウィンドウ上でこのパラメータを有効にする例です。

%% MATLAB コマンドウィンドウの中で
cs = getActiveConfigSet('modelName');
cs.set_param('DownloadToArduino','on');

makevariable」には、カスタム ラピッドプロトタイピング環境向けに用意した「テンプレート Makefile」というファイルの中で、このパラメータ値を取得する際の変数名を記述します。テンプレート Makefile の中で次のように用います。

%% テンプレート Makefile の中で
DOWNLOAD_TO_ARDUINO = |>DOWNLOAD_TO_ARDUINO<|

左辺:Makefile 内で用いる変数名。
右辺:makevariable フィールドで定義した変数名を |> と <| で囲む。
このテンプレート Makefile から作成された実用 Makefile の該当ステートメントは次になります。

%% 実用 Makefile の中で.  パラメータを有効とした場合
DOWNLOAD_TO_ARDUINO = 1

RTW_OPTIONS セクション:rtwgensettings 構造体
rtwgensettings.DerivedFrom = 'ert.tlc';
rtwgensettings.BuildDirSuffix = '_mytarget_ert';
rtwgensettings.Version = '1';
rtwgensettings.SelectCallback = 'mytarget_select_callback_handler(hDlg,hSrc)';
  • DerivedFrom フィールド
rtwgensettings.DerivedFrom = 'ert.tlc';

継承するシステムターゲットファイルを指定します。組み込み向けカスタム ラピッドプロトタイピング環境では 「ert.tlc」 とします。
継承するシステムターゲットファイルを変更すると、コンフィギュレーションパラメータ ウィンドウで表示されるペインやパラメータが変わります。次は継承元が「ert.tlc」と「grt.tlc」における、ペインの違いです。

「grt.tlc」継承時には、「ert.tlc」の継承で見られたサブペイン「テンプレート」、「コード配置」、「データ型変換」がありません。これらは「ert.tlc」に固有のペインだからです。
ここではペインの違いだけを見ましたが、パラメータについても同様です。

  • BuildDirSuffix フィールド
rtwgensettings.BuildDirSuffix = '_mytarget_ert';

ビルドプロセスの過程で作られるフォルダ (次図の mymodel_mytarget_ert) のサフィックスを指定します。


  • Version フィールド
rtwgensettings.Version = '1';

コールバック関数使用時のお約束です。
rtwgensettings 構造体のコールバック関数のみならず、先に述べた rtwoptions 構造体でコールバック関数を使用する際にもこの設定が必要です。

  • SelectCallback フィールド
rtwgensettings.SelectCallback = 'mytarget_select_callback_handler(hDlg,hSrc)';

第1回「システムターゲットファイル 役目その4」で述べたような、システムターゲットファイル選択時の、パラメータに対する値設定や操作制限を行う関数のプロトタイプを設定します。
関数プロトタイプに対応する関数 m ファイルは、Target フォルダ (mytarget¥mytarget など) へ置きます。
コールバックは、「SelectCallback」以外に「ActivateCallback」と「PostApplyCallback」があります。詳しくは MATLAB ドキュメンテーションの「rtwgensettings 構造体」をご覧ください。

不要箇所の削除

テンプレート [matlabroot]¥rtw¥c¥ert¥ert.tlc には RTW_OPTIONS セクション以降に次のコードが存在します。この部位はコメントに書かれているように削除します。

ert.tlc
%% The content between 'BEGIN_CONFIGSET_TARGET_COMPONENT' and 
%% 'END_CONFIGSET_TARGET_COMPONENT' is for the MathWorks internal use
%% only.  You must remove this section if you intend to use this file
%% as a template for your own system target development.
/%
  BEGIN_CONFIGSET_TARGET_COMPONENT
  targetComponentClass = 'Simulink.ERTTargetCC';
  END_CONFIGSET_TARGET_COMPONENT
%/

mytarget_select_callback_handler.m

mytarget_select_callback_handler.m
function mytarget_select_callback_handler(hDlg, hSrc)
...
% デバイスベンダ :: Atmel,  デバイスタイプ :: AVR
slConfigUISetVal(hDlg, hSrc, 'ProdHWDeviceType', 'Atmel->AVR');
slConfigUISetEnabled(hDlg, hSrc, 'ProdHWDeviceType', false);
% 最大 Atomic サイズ :: 整数
slConfigUISetVal(hDlg, hSrc, 'ProdLargestAtomicInteger', 'Char');
slConfigUISetEnabled(hDlg, hSrc, 'ProdLargestAtomicInteger', false);
% 最大 Atomic サイズ :: 浮動小数点
slConfigUISetVal(hDlg, hSrc, 'ProdLargestAtomicFloat', 'None');
slConfigUISetEnabled(hDlg, hSrc, 'ProdLargestAtomicFloat', false);
...
end

rtwgensettings 構造体の SelectCallback フィールドで指定した関数 m ファイルです。slConfigUISetVal() でパラメータの値を、slConfigUISetEnabled() で操作の有効/無効を設定します。

終わりに...

以上で、システムターゲットファイルの説明は終えます。お読みいただいて分かるように、システムターゲットファイルの編集といっても、することは然程多くありませんし、あってもコピペと簡単な修正で済ませられます。手軽に確かめられないのが難点ですが、Coderに触れる機会があれば試されては如何でしょうか。
ここで登場したファイルとその格納先フォルダを示して、第2回を締めくくりたいと思います。最後までお読みくださり、ありがとうございました。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?