exponenta event banner

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

Интеграция унаследованных функций 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];

Создание S-функций для моделирования

Для генерации 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-функций для моделирования

После создания исходных файлов 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-функциональных блоков для вызова сгенерированных S-функций

После компиляции источника 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')

См. также

Связанные темы