このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
デバイス ドライバー System object の構造
デバイス ドライバー ブロックは、ARM® Cortex®-A ベースのハードウェア ボードに展開された場合にカスタム C/C++ コードを生成する MATLAB System ブロックの特殊な形式です。デバイス ドライバー ブロックを作成すると、通信プロトコルやハードウェア ライブラリなど、サポート パッケージでは利用できないハードウェア ボードの機能に簡単にアクセスできます。
Simulink® デバイス ドライバー ブロックは、端子タイプに基づいて、次の 2 つのグループのいずれかに一般化できます。
"ソースブロック" には出力端子のみがあります。シミュレーションでは、ソース ブロックはあらかじめ決められた信号を出力します。この信号は、乱数発生器、保存された配列、または定数値から作成できます。コード生成後、ソース ブロックは、ブロックが表す I/O デバイスから取得されたデータを出力します。たとえば、Digital Read ブロックの生成コードは、デジタル I/O ピンの論理状態を出力します。
"Sink ブロック" には入力端子のみがあります。シミュレーションでは、Sink ブロックは Terminator ブロックとして機能します。コード生成後、Sink ブロックは入力端子信号に従って I/O デバイスを設定および更新します。たとえば、Digital Write ブロックの生成コードは、入力端子信号に等しいデジタル I/O ピンの論理状態を設定および更新します。
デバイス ドライバー ブロックの動作を定義するには、System object™ を使用します。次に、MATLAB System ブロックを使用してオブジェクトを参照し、モデルに含めます。各 System object は、setupImpl
、stepImpl
、および releaseImpl
メソッドを使用して、デバイス ドライバー ブロックのコード初期化、ピン出力動作、およびコード終了を定義します。stepImpl
の条件ステートメントを介して、デバイス ドライバー ブロックはシミュレーション モードで動作します。このモードでは、テスト時またはハードウェア ボードにアクセスできないときに、モデル全体をホスト コンピューター上で実行できます。System object は、ビルド アーティファクトを追加するためのサービスも提供します。このようなアーティファクトには、Simulink 生成コードへのソース ファイル、インクルード パス、共有ライブラリ、およびプリプロセッサ定義が含まれます。これらのアーティファクトは、ブロックの端子プロパティを自動的に定義し、ブロック マスクを生成します。
クラス定義
System object コードの先頭で、System object の名前とその継承元のクラスを定義します。
classdef classname < matlab.System & coder.ExternalDependency & matlab.system.mixin.Propagates ... end
すべての System object は matlab.System
から継承する必要があります。さらに、デバイス ドライバー System object は、生成コードにビルド アーティファクトを追加するための API を提供する coder.ExternalDependency
から継承します。matlab.system.mixin.Propagates
クラスは、System object の出力サイズ、データ型、および実数/複素数を定義するための API を提供します。追加のクラス (matlab.system.mixin.CustomIcon
など) から継承できます。このクラスを使用して、MATLAB System ブロックに表示される名前とアイコンを指定します。
コンストラクター メソッド
Digital Write ブロックの作成およびDigital Read ブロックの作成ガイドで使用されるテンプレート System object クラスは、次の標準のコンストラクター メソッドを使用します。
methods % Constructor function obj = classname(varargin) coder.allowpcode('plain'); setProperties(obj,nargin,varargin); end ... end
初期化、出力、および終了メソッド
これらのメソッドは、初期化、出力、および終了時に行われる処理を定義します。setupImpl
は、ハードウェア周辺装置を初期化する場合に使用します。stepImpl
は、ハードウェア周辺装置に対して読み取りまたは書き込みを行う場合に使用します。releaseImpl
は、使用されているハードウェア リソースを解放する場合に使用します。これらの 3 つのメソッドは、デバイス ドライバー ブロックの動作を定義する基盤です。
methods (Access=protected) function setupImpl(obj) % Implement tasks that need to be performed only once end function stepImpl(obj,u) % Device driver output end function releaseImpl(obj) % Termination code end end
入力信号と出力信号のプロパティ
次のコード セクションでは、ブロックの入力または出力の数およびデータ型とサイズを定義しています。たとえば、Sink ブロックの getNumInputsImpl
メソッドは、入力端子の数を設定しています。同様に、ソース ブロックの getNumOutputsImpl
メソッドは出力端子の数を設定しています。
methods (Access=protected) % Simulink functions function isInputSizeMutableImpl(~,~) flag = false; end ... function num = getNumInputsImpl(~) num = 1; end function num = getNumOutputsImpl(~) num = 0; end end
ビルド アーティファクト
ビルド アーティファクトは、デバイス ドライバー コードのコンパイルに必要なソース ファイルの場所、インクルード パス、共有ライブラリ、ライブラリ検索パス、およびプリプロセッサ定義を定義します。System object への識別文字列を定義するには、getDescriptiveName
メソッドを使用します。コード生成エンジンは、この文字列を使用してエラーを報告します。コード生成コンテキストを指定するには、isSupportedContext
メソッドを使用します。デバイス ドライバー ブロックでは、Real-Time Workshop (rtw) コード生成コンテキストのみが適用されるため、この関数は常に 'rtw'
を指定します。System object のビルドに必要なソース ファイルとヘッダー ファイル、インクルード パス、ライブラリ、および定義を指定するには、updateBuildInfo
メソッドを使用します。
methods (Static)
function name = getDescriptiveName()
name = 'decriptive name
';
end
function tf = isSupportedContext(context)
tf = context.isCodeGenTarget('rtw');
end
function updateBuildInfo(buildInfo, context)
if context.isCodeGenTarget('rtw')
% Update buildinfo
srcDir = fullfile(fileparts(mfilename('fullpath')),'src'); %#ok<NASU>
includeDir = fullfile(fileparts(mfilename('fullpath')),'include');
addIncludePaths(buildInfo,includeDir);
% Use the following API's to add include files, sources and
% linker flags
%addIncludeFiles(buildInfo,'source.h',includeDir);
%addSourceFiles(buildInfo,'source.c',srcDir);
%addLinkFlags(buildInfo,{'-lSource'});
%addLinkObjects(buildInfo,'sourcelib.a',srcDir);
%addCompileFlags(buildInfo,{'-D_DEBUG=1'});
%addDefines(buildInfo,'MY_DEFINE_1')
end
end