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

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

С помощью Legacy Code Tool можно:

  • Предоставьте спецификацию унаследованной функции.

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

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

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

Предоставьте спецификацию унаследованной функции

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

FLT direct Lookup Table ND (const FLT * table ND, const UINT32 nb Dims, const UINT32 * table Dims, const UINT32 * table Idx)

FLT является typedef для плавания, и UINT32 является typedef для неподписанного int32. Устаревший исходный код находится в файлах your_types.h, lookup Table.h и direct Lookup Table ND. 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 () снова. Установите первый вход на 'compile'.

legacy_code('compile', defs);
### Start Compiling rtwdemo_sfun_dlut3D
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tpdc72babf_259e_4068_8f65_13101afe8968', '/mathworks/devel/bat/BR2021ad/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/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '/tmp/BR2021ad_1584584_202060/publish_examples3/tpdc72babf_259e_4068_8f65_13101afe8968/directLookupTableND.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_dlut3D
### Exit

### Start Compiling rtwdemo_sfun_dlut4D
    mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp5e02334a_7851_4a64_93aa_c0908f35b351', '/mathworks/devel/bat/BR2021ad/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/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples3/tp026926c6/ex19426386', '/tmp/BR2021ad_1584584_202060/publish_examples3/tp5e02334a_7851_4a64_93aa_c0908f35b351/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-функции, которые вызывают S-функции. Программное обеспечение помещает блоки в новую модель. Можно скопировать блоки в существующую модель.

legacy_code('slblock_generate', defs);

Показать сгенерированное интегрирование с унаследованным кодом

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

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

См. также

Похожие темы