| 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.tlcdevice.hS-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はコード生成時に実行します。
この例題では、mdlRTWssWriteRTWParamSettings関数を呼び出して、ユーザが入力したパラメータ値(ベースアドレス、ハードウェアゲイン)とユーザが入力した値から計算された値(解像度、オフセット)の両方を含む構造体を生成します。
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-ファイルとドライバブロックのビルド | ![]() |