メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

デバイス ドライバー 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 は、setupImplstepImpl、および 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

参考

|