Интегрируйте внешние функции C, которые реализуют n-мерный поиск по таблице

Интегрируйте наследие C функции, которые реализуют N-мерный поиск по таблице при помощи Legacy Code Tool.

С Legacy Code Tool вы можете:

  • Обеспечьте устаревшую функциональную спецификацию.

  • Сгенерируйте S-функцию C-MEX, которая вызывает унаследованный код во время симуляции.

  • Скомпилируйте и создайте сгенерированную S-функцию для симуляции.

  • Сгенерируйте файл блока TLC и дополнительный rtwmakecfg.m файл, который задает, как сгенерированный код для модели вызывает унаследованный код.

Обеспечьте устаревшую функциональную спецификацию

Функции Legacy Code Tool берут определенную структуру данных или массив структур в качестве аргумента. Можно инициализировать структуру данных путем вызывания функции legacy_code (), использование 'инициализирует' как первый вход. После инициализации структуры присвойте ее свойства значениям, соответствующим унаследованному коду, являющемуся интегрированным. Для подробной справки на свойствах вызовите legacy_code ('справка'). Прототип устаревших функций, названных в этом примере:

FLT directLookupTableND (const FLT *tableND, const UINT32 nbDims, const UINT32 *tableDims, const UINT32 *tableIdx)

FLT является определением типа, чтобы плавать, и UINT32 является определением типа к int32 без знака. Устаревший исходный код находится в файлах your_types.h, lookupTable.h, и directLookupTableND.c.

defs = [];
evalin('base','load rtwdemo_lct_data.mat')

% rtwdemo_sfun_dlut3D
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_dlut3D';
def.OutputFcnSpec = 'single y1 = DirectLookupTable3D(single p1[][][], uint32 p2[3], uint32 u1[3])';
def.HeaderFiles   = {'lookupTable.h'};
def.SourceFiles   = {'directLookupTableND.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

% rtwdemo_sfun_dlut4D
def = legacy_code('initialize');
def.SFunctionName = 'rtwdemo_sfun_dlut4D';
def.OutputFcnSpec = 'single y1 = DirectLookupTable4D(single p1[][][][], uint32 p2[4], uint32 u1[4])';
def.HeaderFiles   = {'lookupTable.h'};
def.SourceFiles   = {'directLookupTableND.c'};
def.IncPaths      = {'rtwdemo_lct_src'};
def.SrcPaths      = {'rtwdemo_lct_src'};
defs = [defs; def];

Сгенерируйте S-функции для симуляции

Чтобы сгенерировать S-функции C-MEX согласно описанию, предоставленному входным параметром 'defs', вызовите функцию legacy_code () снова. Установите первый вход на 'sfcn_cmex_generate'. S-функции вызывают устаревшие функции во время симуляции. Исходный код для S-функций находится в файлах rtwdemo_sfun_dlut3D.c и rtwdemo_sfun_dlut4D.c.

legacy_code('sfcn_cmex_generate', defs);

Скомпилируйте сгенерированные S-функции для симуляции

После того, как вы сгенерируете исходные файлы S-функции C-MEX, чтобы скомпилировать S-функции для симуляции с Simulink®, вызовите функцию legacy_code () снова. Установите первый вход 'компилировать'.

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_dlut3D
    mex('-I/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2019ad_1035872_198992/publish_examples6/tp3b094312/ex19426386', '-c', '-outdir', '/tmp/BR2019ad_1035872_198992/publish_examples6/tp58b4236e_c7fb_4cdf_a499_f971dc982e66', '/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_dlut3D.c', '-I/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2019ad_1035872_198992/publish_examples6/tp3b094312/ex19426386', '/tmp/BR2019ad_1035872_198992/publish_examples6/tp58b4236e_c7fb_4cdf_a499_f971dc982e66/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut3D
### Exit

### Start Compiling rtwdemo_sfun_dlut4D
    mex('-I/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2019ad_1035872_198992/publish_examples6/tp3b094312/ex19426386', '-c', '-outdir', '/tmp/BR2019ad_1035872_198992/publish_examples6/tp017763d0_bc7f_4a92_ae6b_db21639c2366', '/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/directLookupTableND.c')
Building with 'gcc'.
MEX completed successfully.
    mex('rtwdemo_sfun_dlut4D.c', '-I/mathworks/devel/bat/BR2019ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2019ad_1035872_198992/publish_examples6/tp3b094312/ex19426386', '/tmp/BR2019ad_1035872_198992/publish_examples6/tp017763d0_bc7f_4a92_ae6b_db21639c2366/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut4D
### Exit

Сгенерируйте файлы блока TLC для генерации кода

После того, как вы будете компилировать S-функции и использовать их в симуляции, можно вызвать функцию legacy_code () снова. Установите первый вход на 'sfcn_tlc_generate' генерировать файлы блока TLC. Блокируйтесь файлы задают, как сгенерированный код для модели вызывает унаследованный код. Если вы не генерируете файлы блока TLC, и вы пытаетесь сгенерировать код для модели, которая включает S-функции, сбои генерации кода. Файлы блока TLC для S-функций являются rtwdemo_sfun_dlut3D.tlc и rtwdemo_sfun_dlut4D.tlc.

legacy_code('sfcn_tlc_generate', defs);

Сгенерируйте rtwmakecfg.m Файл для Генерации кода

После того, как вы создадите файлы блока TLC, можно вызвать функцию legacy_code () снова. Установите первый вход на 'rtwmakecfg_generate' генерировать rtwmakecfg.m файл, чтобы поддержать генерацию кода. Если необходимый источник и заголовочные файлы для S-функций не находятся в той же папке как S-функции, и вы хотите добавить эти зависимости в make-файле, произведенном во время генерации кода, сгенерировать rtwmakecfg.m файл.

legacy_code('rtwmakecfg_generate', defs);

Сгенерируйте блоки s-function маскированные для вызова сгенерированных S-функций

После того, как вы скомпилируете источник S-функции C-MEX, можно вызвать функцию legacy_code () снова. Установите первый вход на 'slblock_generate' генерировать замаскированные Блоки s-function, которые вызывают S-функции. Программное обеспечение помещает блоки в новую модель. Можно скопировать блоки в существующую модель.

legacy_code('slblock_generate', defs);

Покажите сгенерированную интеграцию с унаследованным кодом

Модель rtwdemo_lct_lut показывает интегрирование модели с унаследованным кодом. Подсистема TestFixpt служит обвязкой для вызова наследия C функция и блоки Отображения, сравнивает вывод функции с выводом встроенных блоков поиска Simulink®. Результаты идентичны.

open_system('rtwdemo_lct_lut')
open_system('rtwdemo_lct_lut/TestLut1')
sim('rtwdemo_lct_lut')

Смотрите также

Похожие темы