Real-Time Workshop User's Guide | ![]() ![]() |
概要
デバイスドライバをインライン化するには、以下を与える必要があります。
driver
.c
: C MEX S-Functionソースコード。S-Function APIが要求する関数を実現します。これらは、「必要な関数」で説明したように、非インラインドライバで要求される関数と同じです。これらの関数に対して、Simulinkでシミュレーション用のコードのみが必要です。driver
.c
は、ターゲットハードウェア環境での利用を目的とするメモリ位置を読み込みや書き出しをしないことを確認することが重要です。driver
.tlc
によって生成されるリアルタイムのドライバの実現は、ターゲットハードウェアにアクセスします。
.c
内で使用するmdlRTW
関数。この関数の唯一の目的は、コード生成中のパラメータデータの評価およびフォーマットです。パラメータデータは、model
.rtw
ファイルの出力です。ドライバブロックがコード生成プロセスに情報を渡す必要がない場合は、mdlRTW
関数を作成する必要はありません。「mdlRTWとコード生成」を参照してください。driver
.dll
(PC) または driver
(UNIX)。C MEX S-FunctionソースコードからビルドされたMEX-ファイル。このコンポーネントは、以下の場合に利用されます。mdlRTW
関数がMEX-ファイル内にある場合は、コードジェネレータはパラメータデータをmodel
.rtw
ファイルに書き出すためにmdlRTW
を実行します。driver
.tlc
: S-Function APIで必要な関数のリアルタイムの実現を生成するTLC関数。例題: インライン化されたADCドライバ
デバイスドライバのインライン化の理解のための手助けとして、この節では、ADCデバイスに対するドライバブロックの例を説明します。「インライン化されたADCドライバのソースコード」には、以下に対するコードがリストされています。
adc.c
adc.tlc
device.h
S-Functionブロックdriver
は、マスクされ、アイコンをもちます。図 17-8は、S-Functionブロックdriver
を使ったモデルを示します。図 17-9は、ブロックのダイアログボックスを示します。
図 17-8: モデル内のADC S-Functionドライバブロック
Simulation Code.. adc.c
は、シミュレーション中に実行されるほとんどすべての関数を含みます(唯一の例外はmdlRTW
で、コード生成中に実行します)。これらの関数のほとんどは、「非インラインS-Functionデバイスドライバの作成」の非リアルタイムコードの例と同じです。S-Functionは、つぎの関数を実現します。
mdlInitializeSizes
は、(mdlCheckParameters
によって) 入力パラメータを確認し、すべてのパラメータをチューニング不可能と宣言します。この関数は、ポートを初期化し、サンプル時間数を設定します。mdlInitializeSampleTimes
は、ユーザが入力する値を使ってサンプル時間を設定します。mdlStart
はMATLABコマンドウィンドウにメッセージを表示します。mdlOutputs
はすべてのチャンネルにゼロを出力します。mdlTerminate
はスタブルーチンです。adc.c
は、シミュレーションコードのみを含むので、MATLAB_MEX_FILE
によって、C MEX-ファイルとしてコンパイルされることを保証します。
#ifndef MATLAB_MEX_FILE
#error "Fatal Error: adc.c can only be used to create C-MEX S-Function"
#endif
同じ理由により、adc.c
は条件なしてsimulink.c
をインクルードします。
mdlRTWとコード生成. mdlRTW
は、S-Functionがデータ構造体を生成したmodel
.rtw
ファイルに書き出すメカニズムです。Target Language Compilerは、コード生成時にこれらのデータ構造体を使います。ドライバの他の関数と異なり、mdlRTW
はコード生成時に実行します。
この例題では、mdlRTW
ssWriteRTWParamSettings関数を呼び出して、ユーザが入力したパラメータ値(ベースアドレス、ハードウェアゲイン)とユーザが入力した値から計算された値(解像度、オフセット)の両方を含む構造体を生成します。
static void mdlRTW(SimStruct *S) { boolean_T polarity = adcIsUnipolar(MIN_SIGNAL_VALUE, MAX_SIGNAL_VALUE); real_T offset = polarity ? 0.0 : MIN_SIGNAL_VALUE/HARDWARE_GAIN; real_T resolution = (((MAX_SIGNAL_VALUE-MIN_SIGNAL_VALUE)/HARDWARE_GAIN)/ ADC_NUM_LEVELS); char_T baseAddrStr[128]; if ( mxGetString(BASE_ADDRESS_PARAM, baseAddrStr, 128) ) { ssSetErrorStatus(S, "Error reading Base Address parameter, " "need to increase string buffer size."); return; } if ( !ssWriteRTWParamSettings(S, 4, SSWRITE_VALUE_QSTR, "BaseAddress", baseAddrStr, SSWRITE_VALUE_NUM, "HardwareGain", HARDWARE_GAIN, SSWRITE_VALUE_NUM, "Resolution", resolution, SSWRITE_VALUE_NUM, "Offset", offset) ) { return; /* An error occured, which will be reported by Simulink. */ } } /* end: mdlRTW */
SFcnParamSettings { BaseAddress "0x300" HardwareGain 1.0 Resolution 0.0048828125 Offset -10.0 }
(SFcnParamSettingsの実際の値は、ユーザが入力した値から得られます)。
SFcnParamSettings構造体に格納された値は、つぎの割り当てステートメントのように、driver
.tlc
内で参照されます。
%assign baseAddr = SFcnParamSettings.BaseAddress
Target Language Compilerは、baseAddrのような変数を使って、model
.c
やmodel
.h
のようなリアルタイムコードファイルにパラメータを生成します。これは、つぎの節で説明します。
TLCファイル. adc.tlc
は、3つのTLC関数を含みます。BlockTypeSetup
関数は、つぎのステートメント
#include "device.h"
をmodel
.h
ファイルに生成します。その他の2つの関数Start
とOutputs
は、model
.c
のMdlStart
およびMdlOutputs
関数の内部でコードを生成します。
adc.tlc
および生成されたコード内のステートメントは、device.hで定義されたマクロとシンボルを使い、SFcnParamSettings構造体のパラメータ値を使います。つぎのコードは、上記のSFcnParamSettingsの値を使って定数値を含むコードを生成します。
%assign baseAddr = SFcnParamSettings.BaseAddress %assign hwGain = SFcnParamSettings.HardwareGain ... adcSetHardwareGain(%<baseAddr>, adcGetGainMask(%<hwGain>));
上記のTLCコードは、このステートメントをmodel
.c
のMdlOutputs
関数に生成します。
adcSetHardwareGain(0x300, adcGetGainMask(1.0));
adcSetHardwareGainとadcGetGainMaskは、低レベルのハードウェア呼び出しを展開するマクロです。
S-Functionラッパー
ドライバコードをターゲットシステムに組み込むほかの手法は、S-Functionラッパーを使うことです。この手法では、以下のファイルを作成します。
ラッパーS-Functionの使用法に関する詳細は、Writing S-Functionsを参照してください。
![]() | 非インラインS-Functionデバイスドライバの作成 | MEX-ファイルとドライバブロックのビルド | ![]() |