はじめに
Simulink モデルを Arduino や Rasberry Pi などの外部デバイス上で実行させる際、 とても有り難いアドオンの「Simulink Support Package for ○○」。対象のハードウェアボードをモデル設定パラメータ ウィンドウで選び、ツールストリップの [ビルド] アイコンをクリックするだけで、コード生成からデバイス書き込みまでを自動に行ってくれる。
では、サポートパッケージの提供されていないカスタムボードはこの恩恵に預かれないのでしょうか。そんなことはありません。Simulink Coder や Embedded Coder (以後、Coder と略します) には、ビルドプロセスをカスタマイズするメカニズムが備わっており、サポートパッケージ ライクなラピッドプロトタイピング環境を構築できます。
本記事では、「テンプレートmakefileアプローチ」に利用したラピッドプロトタイピング環境の構築について紹介します。
対象ハードウェアと開発ツール
カスタム ラピッドプロトタイピング環境の構築に当たって、対象となるハードウェア ボード、およびその開発環境ツールが必要になるので、ここではそれらを以下としました。
対象ハードウェア ボード | Arduino Uno Rev3 |
開発環境ツール | Arduino IDE 1.8.19 |
ビルドプロセス カスタマイズの概要
ビルドプロセスは2つの段階で構成されます。モデルからC/C++ソースコードを生成する「コード生成」段階と、生成したソースコードからバイナリファイルを作る「make」段階です。
カスタム ラピッドプロトタイピング環境は、これらの前後に、対象ハードウェア開発環境ツールを呼び出すための処理を実装して構築します。
Coder で提供される、これらの処理を記述できる箇所―フックポイント―は「entry」、「before_tlc」、「after_tlc」、「before_make」、「after_make」、「exit」、「error」です。ビルド開始から終了までのフローは次となります。
![]() |
---|
出典:関数プロトタイプ STF_make_rtw_hook.m と引数 |
テンプレートmakefileアプローチでは、フックポイントへ処理を実装する手段として、次で示すような STF_make_rtw_hook.m という関数 m ファイルを用います。
※)「STF」には後述の「システムターゲットファイル」の名前が入ります。
function STF_make_rtw_hook(...
hookMethod, modelName, rtwroot, templateMakefile, buildOpts, buildArgs, buildInfo)
switch hookMethod
case 'error'
… % 何かの処理. 以下同様
case 'entry'
…
case 'before_tlc'
…
case 'after_tlc'
…
case 'before_make'
…
case 'after_make'
…
case 'exit'
…
end %End of switch
end %End of function
このファイルが 「Targetフォルダ」―次項を参照―内に存在すると、MATLABのビルドプロセスを管理する処理は、フックポイント毎にこの関数を呼び出します。関数を呼び出したフックポイント情報は、引数 hookMethod を通じて switch 文へ渡り、該当する case 文に書かれた処理が実行される、という仕組みです。
ラピッドプロトタイピング環境用フォルダ
ラピッドプロトタイピング環境の構築で必要なフォルダやファイルを説明するに当たり、名前が無いと不便なので、ここではそれを 「mytarget」 とします。
下の図のような階層構造を有する、ラピッドプロトタイピング環境用フォルダを作成します。これらフォルダの名前は、英子文字、数字、アンダーバーのみを使用します。

Target Root フォルダ
カスタム ラピッドプロトタイピング環境の最上位フォルダです。
フォルダ名はラピッドプロトタイピング環境に付けた名前とします。ここでは「mytarget」となります。
Target フォルダ
ビルドプロセスに係る 「コントロール ファイル」 と呼ばれるファイルを格納するフォルダです。
フォルダ名はカスタム ラピッドプロトタイピング環境に付けた名前を用います。ここでは 「mytarget」 となります。
先に紹介した _make_rtw_hook.m ファイルや、後述するシステムターゲットファイルは、このフォルダに置かれます。
Blocks フォルダ
Simulink support Package for Arduino Hardware では、「Analog Input」や「Digital Output」といった、Arduino ハードウェア専用ブロックが提供されます。これと同じように、カスタム ラピッドプロトタイピング環境でハードウェア固有のブロックやデバイスドライバを提供する場合は、それらに関連するファイルを収めます。
フォルダ名は「blocks」です。
DevTool フォルダ
対象ハードウェア向けに、クロス開発環境ツールのデフォルトと異なる仕様でビルドを行う際のファイルや、クロス開発環境ツール固有の設定を記述したMakefileなどは、このフォルダへ収めます。
フォルダ名は使用するクロス開発環境にちなんだ名前―例えば Arduino IDE であれば 「arduino_ide」など―とします。
本記事で扱う各フォルダ名は次となります。

システムターゲットファイル
ファイル名
カスタム ラピッドプロトタイピング環境に付けた名前を用います。拡張子は 「tlc」 です。ここでは「mytarget.tlc」となります。
フォルダ
ファイルは Target フォルダへ置きます。つまり「mytarget\mytarget」です。
役目その1
カスタム ラピッドプロトタイピング環境完成の暁には、その指定を次のように行います。
- Simulink ツールストリップの [モデル設定] アイコンをクリック
⇨ モデル コンフィギュレーション パラメータが開く - [コード生成] ペインを選ぶ
- [システム ターゲットファイル]ー[参照] ボタンをクリック
⇨ システム ターゲット ファイル ブラウザが開く - システム ターゲット ファイル ブラウザのリストから 「mytarget.tlc」 を選ぶ
このように構築したカスタム ラピッドプロトタイピング環境を、システム ターゲット ファイル ブラウザのリストに表示して、選択できるようにすることが、このファイルの役目その1です。
役目その2
システムターゲットファイルは 「コード生成」 段階の起点としての役割りを持ちます。次のコードは本記事のシステムターゲットファイル「mytarget.tlc」の抜粋で、この中の 「codegenentry.tlc」 がそれに当たります。
…
%selectfile NULL_FILE
%assign CodeFormat = "Embedded-C"
…
%include "codegenentry.tlc"
…
「%include "codegenentry.tlc"」と、ファイルを読み込むステートメントになっていますが、「コード生成」処理はソースコードを1行ずつ解釈・実行するインタプリタ方式なので、実際は codegenentry.tlc に書かれたコードが実行されて行きます。
役目その3
カスタム ラピッドプロトタイピング環境専用のペインやパラメータを提供します。次の図は [システム ターゲット ファイル] を 「mytarget.tlc」とした際に現れる、[My Target HW options] ペインと、そのペイン内で表示される [Download to board] パラメータです。

役目その4
コンフィギュレーション パラメータの初期値を、選択したシステム ターゲット ファイルに応じて変更したり、パラメータに対する操作を制限したりします。
本ラピッドプロトタイピング環境が対象とするハードウェアは Arduino Uno のみですから、 [ハードウェア実行] ペインの [デバイスベンダー] と [デバイスタイプ] は、それぞれ「Atmel」と「AVR」でなければならなく、加えてそれらを変更して欲しくありません。
次の図は「mytarget.tlc」選択後の、[ハードウェア実行] ペインの様子です。[デバイスベンダー]、 [デバイスタイプ] が「Atmel」、「AVR」に設定され、変更を受け付けない状態を表すグレーアウトになっています。

終わりに...
第1回は、
- ビルドプロセスとカスタマイズの概要
- フォルダ構成
- システムターゲットファイルの働き
について記しました。意外と簡単にカスタマイズは行える、という印象を持って頂けたのではないでしょうか。次回は、システムターゲットファイルの役目を担うコードについて述べます。
参考文献
フォルダーおよびファイルの命名規則
システム ターゲット ファイルのカスタマイズ