Интегрируйте устаревшие функции C, которые передают их входные и выходные параметры с помощью параметров типа данных с фиксированной точкой с помощью Legacy Code Tool.
С помощью Legacy Code Tool можно:
Предоставьте спецификацию унаследованной функции.
Сгенерируйте S-функцию C-MEX, которая вызывает унаследованный код во время симуляции.
Скомпилируйте и создайте сгенерированную S-функцию для симуляции.
Сгенерируйте файл блока TLC и необязательный файл rtwmakecfg.m, который задает, как сгенерированный код для модели вызывает унаследованный код.
Функции Legacy Code Tool берут в качестве аргумента определенную структуру данных или массив структур. Вы можете инициализировать структуру данных, вызвав функцию legacy_code (), используя 'initialize' в качестве первого входа. После инициализации структуры присвойте ее свойства значениям, соответствующим унаследованному коду. Прототип наследственных функций, вызываемых в этом примере, является:
myFixpt timesS16 (const myFixpt in1, const myFixpt in2, const uint8_T fracLength)
myFixpt логически является фиксированным точкой типом данных, который физически является typedef к 16-битному целому числу:
myFixpt = Simulink.NumericType; myFixpt.DataTypeMode = 'Fixed-point: binary point scaling'; myFixpt.Signed = true; myFixpt.WordLength = 16; myFixpt.FractionLength = 10; myFixpt.IsAlias = true; myFixpt.HeaderFile = 'timesFixpt.h';
Устаревший исходный код находится в файлах timesFixpt.h и timesS16.c.
% rtwdemo_sfun_gain_fixpt def = legacy_code('initialize'); def.SFunctionName = 'rtwdemo_sfun_gain_fixpt'; def.OutputFcnSpec = 'myFixpt y1 = timesS16(myFixpt u1, myFixpt p1, uint8 p2)'; def.HeaderFiles = {'timesFixpt.h'}; def.SourceFiles = {'timesS16.c'}; def.IncPaths = {'rtwdemo_lct_src'}; def.SrcPaths = {'rtwdemo_lct_src'};
Чтобы сгенерировать S-функцию C-MEX согласно описанию, предоставленному входным параметром 'def', снова вызовите legacy_code функции () с первым входным набором 'sfcn _ cmex _ generate'. S-функция вызывает устаревшие функции во время симуляции. Исходный код для S-функции находится в файле rtwdemo_sfun_gain_fixpt.c.
legacy_code('sfcn_cmex_generate', def);
После того, как вы сгенерируете исходный файл S-функции C-MEX, чтобы скомпилировать S-функцию для симуляции с Simulink ®, снова вызовите legacy_code функции () с первым входным набором на 'compile'.
legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_fixpt mex('-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex05928773', '-c', '-outdir', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpffa46896_ae8c_46b0_bf61_6f4e5d3e21e6', '/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src/timesS16.c') Building with 'gcc'. MEX completed successfully. mex('rtwdemo_sfun_gain_fixpt.c', '-I/mathworks/devel/bat/BR2021ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2021ad_1584584_202060/publish_examples4/tp8ee346b5/ex05928773', '/tmp/BR2021ad_1584584_202060/publish_examples4/tpffa46896_ae8c_46b0_bf61_6f4e5d3e21e6/timesS16.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling rtwdemo_sfun_gain_fixpt ### Exit
После того, как вы скомпилируете S-функцию и используете ее в симуляции, можно вызвать функцию legacy_code () снова. Установите первый вход на 'sfcn _ tlc _ generate', чтобы сгенерировать блочный файл TLC. Блочный файл задает, как сгенерированный код для модели вызывает унаследованный код. Если вы не генерируете файл блока TLC и пытаетесь сгенерировать код для модели, которая включает S-функцию, генерация кода прекращается. Файл блока TLC для S-функции: rtwdemo_sfun_gain_fixpt.tlc.
legacy_code('sfcn_tlc_generate', def);
После создания файла блока TLC можно вызвать функцию legacy_code () снова. Установите первый вход на 'rtwmakecfg _ generate', чтобы сгенерировать файл rtwmakecfg.m, который поддерживает генерацию кода. Если требуемые исходный код и заголовочные файлы для S-функции находятся не в той же папке, что и S-функция, и вы хотите добавить эти зависимости в make-файл, произведенный во время генерации кода, сгенерируйте файл rtwmakecfg.m.
legacy_code('rtwmakecfg_generate', def);
После компиляции источника S-функции C-MEX можно вызвать функцию legacy_code () снова. Установите первый вход на 'slblock _ generate', чтобы сгенерировать блок s-function, который вызывает эту S-функцию. Программа помещает блок в новую модель. Можно скопировать блок в существующую модель.
legacy_code('slblock_generate', def);
Модель rtwdemo_lct_fixpt_params показывает интегрирование модели с унаследованным кодом. Подсистема TestFixpt служит обвязкой для вызова унаследованной функции C через сгенерированную S-функцию.
open_system('rtwdemo_lct_fixpt_params') open_system('rtwdemo_lct_fixpt_params/TestFixpt') sim('rtwdemo_lct_fixpt_params')