Интегрируйте внешние функции C, которые передают аргументы ввода и вывода как параметры с типом данных с фиксированной точкой

Интегрируйте наследие C функции, которые передают их вводы и выводы при помощи параметров типа данных с фиксированной точкой с Legacy Code Tool.

С Legacy Code Tool вы можете:

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

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

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

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

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

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

myFixpt timesS16 (const myFixpt in1, const myFixpt in2, const uint8_T fracLength)

myFixpt является логически типом данных фиксированной точки, который является физически определением типа к 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-функцию для симуляции

Чтобы сгенерировать S-функцию C-MEX согласно описанию, предоставленному входным параметром 'определение', вызовите функцию legacy_code () снова с первым входным набором к 'sfcn_cmex_generate'. S-вызовы-функции наследие функционируют в процессе моделирования. Исходный код для S-функции находится в файле rtwdemo_sfun_gain_fixpt.c.

legacy_code('sfcn_cmex_generate', def);

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

После того, как вы сгенерируете исходный файл S-функции C-MEX, чтобы скомпилировать S-функцию для симуляции с Simulink®, вызовите функцию legacy_code () снова с первым входным набором, чтобы 'скомпилировать'.

legacy_code('compile', def);
### Start Compiling rtwdemo_sfun_gain_fixpt
    mex('-I/mathworks/devel/bat/BR2020ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2020ad_1316498_123416/publish_examples0/tpd547fd45/ex05928773', '-c', '-outdir', '/tmp/BR2020ad_1316498_123416/publish_examples0/tpe2eaad25_bb67_4464_ac90_4df45c7d4b57', '/mathworks/devel/bat/BR2020ad/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/BR2020ad/build/matlab/toolbox/rtw/rtwdemos/rtwdemo_lct_src', '-I/tmp/BR2020ad_1316498_123416/publish_examples0/tpd547fd45/ex05928773', '/tmp/BR2020ad_1316498_123416/publish_examples0/tpe2eaad25_bb67_4464_ac90_4df45c7d4b57/timesS16.o')
Building with 'gcc'.
MEX completed successfully.
### Finish Compiling rtwdemo_sfun_gain_fixpt
### Exit

Сгенерируйте файл блока TLC для генерации кода

После того, как вы будете компилировать S-функцию и использовать ее в симуляции, можно вызвать функцию legacy_code () снова. Установите первый вход на 'sfcn_tlc_generate' генерировать файл блока TLC. Файл блока задает, как сгенерированный код для модели вызывает унаследованный код. Если вы не генерируете файл блока TLC, и вы пытаетесь сгенерировать код для модели, которая включает S-функцию, сбои генерации кода. Файл блока TLC для S-функции: rtwdemo_sfun_gain_fixpt.tlc.

legacy_code('sfcn_tlc_generate', def);

Сгенерируйте rtwmakecfg.m Файл для Генерации кода

После того, как вы создадите файл блока TLC, можно вызвать функцию legacy_code () снова. Установите первый вход на 'rtwmakecfg_generate' генерировать rtwmakecfg.m файл, который поддерживает генерацию кода. Если необходимый источник и заголовочные файлы для S-функции не находятся в той же папке как S-функция, и вы хотите добавить эти зависимости в make-файле, произведенном во время генерации кода, сгенерировать rtwmakecfg.m файл.

legacy_code('rtwmakecfg_generate', def);

Сгенерируйте блок s-function маскированный для вызова сгенерированной S-функции

После того, как вы скомпилируете источник 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')

Смотрите также

Похожие темы