Main Content

sl_customization.m によるビルド プロセスのカスタマイズ

Simulink® カスタマイズ ファイル sl_customization.m は、MATLAB® を使用してビルド プロセス インターフェイスをカスタマイズできるようにする機能です。MATLAB パス上にファイルがあり、開始時にそのファイル内で指定されているカスタマイズが Simulink セッションに適用されると、Simulink ソフトウェアは sl_customization.m ファイルを読み込みます。sl_customization.m カスタマイズ ファイルの詳細については、Simulink でのカスタマイズの登録を参照してください。

sl_customization.m ファイル

sl_customization.m ファイルを使用し、インストール固有のフック関数を登録してビルド プロセス中に呼び出すことができます。sl_customization.m を通して登録するフック関数は、システム ターゲット ファイル (STF) フック (STF_make_rtw_hook ファイルによるビルド プロセスのカスタマイズを参照) と、コード生成後のコマンド (コード生成後のビルド プロセスのカスタマイズを参照) を補足します。

下の図に、インストールレベルのフックと、ビルド プロセスをカスタマイズするために使用できる他の機能の間の関係を示します。

sl_customization.m を使用したビルド プロセス フック関数の登録

ビルド プロセス中に呼び出されるインストールレベルのフック関数を登録するには、sl_customization.m と呼ばれる MATLAB 関数を作成し、カスタマイズする Simulink インストールの MATLAB パス上にそれを含めます。関数 sl_customization は、1 つの引数を受け入れます。この引数は、カスタマイズ マネージャー オブジェクトのハンドルです。たとえば以下のようになります。

function sl_customization(cm)

カスタマイズ用の出発点として、関数 sl_customization は以下の代入ステートメントを使用して、最初に既定 (出荷時) のカスタマイズを取得しなければなりません。

hObj = cm.RTWBuildCustomizer;

それから、カスタマイズを登録するメソッドを呼び出します。カスタマイズ マネージャー オブジェクトは、ビルド プロセスのフック カスタマイズを登録するための以下のメソッドを含みます。

  • addUserHook(hObj, hookType, hook)

    hookType によって表現されるビルド プロセス段階に対して、hook によって指定される MATLAB フック スクリプトまたは関数を登録します。hookType 用の有効値は、'entry''before_tlc''after_tlc''before_make''after_make''exit' です。

このメソッドを使用して関数 sl_customization のインスタンスにインストール固有のフック関数を登録します。

Simulink ソフトウェアは、起動時に sl_customization.m ファイルを読み込みます。続いてファイルを変更する場合は、Simulink セッションを再び開始するか、コマンド ウィンドウで次のコマンドを入力し、その変更を有効にしなければなりません。

sl_refresh_customizations

メモ

addUserHook メソッドを使用して以下を行わないでください。

  • モデル コンフィギュレーションを変更する。たとえば、このメソッドを使用して以下を行わないでください。

    • モデル バリアント間の切り替え。

    • 関数 set_param の呼び出し。

    モデル コンフィギュレーションを変更すると、予期しないコード生成結果となる可能性があります。

  • モデルをコンパイルするコマンドを実行する。モデルをコンパイルすると、予期しない動作が生じる可能性があります。

フック関数 sl_customization.m に使用できる変数

以下の変数をフック関数 sl_customization.m に使用できます。

  • modelName ― Simulink モデルの名前 (全段階で有効)

  • dependencyObject ― 生成コードの依存関係を含んでいるオブジェクト ('after_make' 段階のみで有効)

フック スクリプトは有効な変数に直接アクセスすることができます。フック関数は引数として有効な変数を関数に渡すことができます。以下に例を示します。

hObj.addUserHook('after_make', 'afterMakeFunction(modelName,dependencyObject);');

sl_customization.m を使用したビルド プロセスのカスタマイズの例

ビルド プロセス カスタマイズ用の sl_customization.m の例に示す sl_customization.m ファイルでは addUserHook メソッドを使用してビルド プロセスの 'entry''after_tlc' の各段階で呼び出されるインストール固有のビルド プロセス フックを指定します。フック関数ソース コードの詳細については、CustomRTWEntryHook.m および CustomRTWPostProcessHook.m の例を参照してください。

例1 ビルド プロセス カスタマイズ用の sl_customization.m
function sl_customization(cm)
% Register user customizations

% Get default (factory) customizations
hObj = cm.RTWBuildCustomizer;

% Register build process hooks
hObj.addUserHook('entry', 'CustomRTWEntryHook(modelName);');
hObj.addUserHook('after_tlc', 'CustomRTWPostProcessHook(modelName);');

end
例2 CustomRTWEntryHook.m
function [str, status] = CustomRTWEntryHook(modelName)
str =sprintf('Custom entry hook for model ''%s.''',modelName);
disp(str)
status =1;
例3 CustomRTWPostProcessHook.m
function [str, status] = CustomRTWPostProcessHook(modelName)
str =sprintf('Custom post process hook for model ''%s.''',modelName);
disp(str)
status =1;

上記の 3 つのファイルをカスタマイズする Simulink インストールの MATLAB パスに含めると、コード化されたフック関数メッセージがビルド用に表示される出力内に表示されます。たとえば、ERT ベースのモデル UserDefinedDataTypes を開く場合、[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成] ペインを開き、Ctrl+B を押してビルドを開始すると、以下のメッセージが表示されます。

>> UserDefinedDataTypes

### Starting build procedure for model: UserDefinedDataTypes
Custom entry hook for model 'UserDefinedDataTypes.'
Custom post process hook for model 'UserDefinedDataTypes.'
### Successful completion of build procedure for model: UserDefinedDataTypes
>> 

addUserHook メソッドを使用したビルド プロセスのカスタマイズ

この例では、addUserHook メソッドを使用してビルド フックを登録し、ビルド プロセスをカスタマイズする方法を示します。モデル例ではカスタム ハードウェア ボードを使用しています。'after_tlc' ビルド ステージでカスタム フック メソッドを実行することで、ビルド プロセスはカスタム メイン ファイルをリンクします。

ターゲット フレームワークを使用した新しいハードウェア デバイスの登録

モデルのハードウェア設定が既にある場合は、このセクションはスキップできます。

MATLAB にハードウェア デバイスの記述を提供する target.Board オブジェクトを作成します。

myProcessor = target.get('Processor', ...
           'Intel-x86-64 (Windows64)');

myBoard = target.create('Board', ...
'Name', 'My Board with Custom Main File Linked', ...
'Processors', myProcessor);

ターゲット オブジェクトを内部データベースに追加します。

boardObj = target.add(myBoard);
"target.add" summary:

    Objects added to internal database for current MATLAB session:
        target.Board        "My Board with Custom Main File Linked"
    Objects not added because they already exist:
        target.Processor    "Intel-x86-64 (Windows64)"

モデルのハードウェア ボードの指定とコードのビルド

モデルのハードウェア ボードを指定し、GenerateSampleERTMain オプションを無効にします。

model = 'CustomBuildCounter';
open_system(model);

set_param(model, 'HardwareBoard', myBoard.Name);
set_param(model, 'IncludeMdlTerminateFcn', 'on');
set_param(model, 'GenerateSampleERTMain', 'off');

指定されたハードウェア ボードに関連付けられたツールチェーンとプロセッサに関連するコンフィギュレーション パラメーターが自動的に選択されます。

カスタマイズしなければ、ビルド プロセスでは matlabroot/rtw/c/src/common フォルダーの静的 rt_main.c ファイルが使用されます。

slbuild(model);
### Starting build procedure for: CustomBuildCounter
### Successful completion of build procedure for: CustomBuildCounter

Build Summary

Top model targets built:

Model               Action                        Rebuild Reason                                    
====================================================================================================
CustomBuildCounter  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 17.294s

RTW.BuildInfo オブジェクトには、rt_main.c など、ビルド プロセスで使用されるソース ファイルの名前が含まれます。

bi = load(fullfile([model '_ert_rtw'], 'buildInfo.mat'));
srcfiles = getSourceFiles(bi.buildInfo, true, false)'
srcfiles = 2x1 cell
    {'$(START_DIR)/CustomBuildCounter_ert_rtw/CustomBuildCounter.c'}
    {'$(MATLAB_ROOT)/rtw/c/src/common/rt_main.c'                   }

ビルド プロセスのカスタマイズ

カスタム フック メソッドを使用すると、既定の rt_main.c を使用する代わりにカスタム メイン ファイルを登録できます。

各カスタム フック メソッドは、モデル設定と互換性があることをチェックする必要があります。たとえば、registerCustomMain.m では、関数はフック メソッドが特定のハードウェア ボードにのみ適用されるかをチェックします。

edit(fullfile(pwd, 'myHooks', 'registerCustomMain.m'))

sl_refresh_customization を介してカスタム フック メソッドを登録します。

addpath('myHooks');
sl_refresh_customizations

コードを生成する前に、以前のコード生成フォルダーとモデル キャッシュを削除します。

rmdir(fullfile(pwd, [model '_ert_rtw']), 's');
rmdir(fullfile(pwd, 'slprj'), 's');
delete([model '.slxc']);

モデルをビルドします。

slbuild(model);
### Starting build procedure for: CustomBuildCounter
Custom after_tlc hook to register custom main file for model 'CustomBuildCounter.'
### Successful completion of build procedure for: CustomBuildCounter

Build Summary

Top model targets built:

Model               Action                        Rebuild Reason                                    
====================================================================================================
CustomBuildCounter  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 16.665s

ビルド プロセスが myMainFile.c を使用しているかチェックします。

bi = load(fullfile([model '_ert_rtw'], 'buildInfo.mat'));
srcfiles = getSourceFiles(bi.buildInfo, true, false)'
srcfiles = 2x1 cell
    {'$(START_DIR)/CustomBuildCounter_ert_rtw/CustomBuildCounter.c'}
    {'$(START_DIR)/myMainFile.c'                                   }

クリーンアップ

モデルを閉じ、内部データベースからターゲット オブジェクトを削除し、カスタム フック メソッドの登録を解除します。

close_system(model, 0);
target.remove(boardObj);
"target.remove" summary:

    Objects removed from internal database:
        target.Board    "My Board with Custom Main File Linked"
rmpath('myHooks');
sl_refresh_customizations

ワークスペースに追加された変数を消去します。

clear INC K LIMIT RESET model bi srcfiles myBoard myProcessor boardObj

参考

関連するトピック