Интеграция унаследованных функций C, реализующих N-мерный табличный поиск с помощью инструмента «Унаследованный код».
С помощью инструмента «Унаследованный код» можно выполнять следующие действия:
Предоставьте спецификацию устаревшей функции.
Создайте S-функцию C-MEX, которая вызывает унаследованный код во время моделирования.
Скомпилировать и построить сгенерированную S-функцию для моделирования.
Создайте файл блока TLC и дополнительный файл rtwmakecfg.m, который указывает, как созданный код для модели вызывает код из предыдущих версий.
В качестве аргумента устаревшие функции Code Tool используют определенную структуру данных или массив структур. Можно инициализировать структуру данных, вызвав функцию legacy_code (), используя «initialize» в качестве первого ввода. После инициализации структуры присвойте ее свойства значениям, соответствующим интегрированному унаследованному коду. Прототип устаревших функций, вызываемых в этом примере:
FLT directLookupTaureND (const FLT * taureND, const UINT32 nbDims, const UINT32 * taureDims, const UINT32 * taureIdx)
FLT является typedef для плавания, а UINT32 является typedef для неподписанных int32. Устаревший исходный код находится в файлах your_types.h, lookupTable.h и directLookupTaureND.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];
Для генерации C-MEX S-функций согласно описанию, предоставленному входным аргументом '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 модели показана интеграция модели с унаследованным кодом. Подсистема StartFixpt служит в качестве электрического жгута для вызова унаследованной функции C, а блоки Display сравнивают выходные данные функции с выходными данными встроенных блоков поиска Simulink ®. Результаты идентичны.
open_system('rtwdemo_lct_lut') open_system('rtwdemo_lct_lut/TestLut1') sim('rtwdemo_lct_lut')
