Интеграция устаревших функций 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-функции 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-функции 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
После того, как вы скомпилируете 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);
После того, как вы создаете файлы блоков TLC, можно вызвать функцию legacy_code () снова. Установите первый вход на 'rtwmakecfg _ generate', чтобы сгенерировать файл rtwmakecfg.m для поддержки генерации кода. Если требуемые исходный код и заголовочные файлы для S-функций находятся не в той же папке, что и S-функции, и вы хотите добавить эти зависимости в make-файл, произведенный во время генерации кода, сгенерируйте файл rtwmakecfg.m.
legacy_code('rtwmakecfg_generate', defs);
После компиляции источника 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')