exponenta event banner

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

Интеграция унаследованных функций C, которые передают свои входные и выходные данные, с помощью параметров фиксированного типа данных с помощью инструмента «Унаследованный код».

С помощью инструмента «Унаследованный код» можно выполнять следующие действия:

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

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

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

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

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

В качестве аргумента устаревшие функции 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';

Исходный код из прежних версий находится в файлах startFixpt.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 S-функции в соответствии с описанием, предоставленным входным аргументом «def», снова вызовите функцию legacy_code () с первым входным набором «sfcn _ cmex _ generate». S-функция вызывает унаследованные функции во время моделирования. Исходный код S-функции находится в rtwdemo_sfun_gain_fixpt.c файла.

legacy_code('sfcn_cmex_generate', def);

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

После создания исходного файла C-MEX S-функции для компиляции 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

Создание файла блока 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.m, поддерживающего создание кода, задайте для первого входа значение «rtwmakecfg _ generate». Если требуемые исходные и заголовочные файлы для S-функции находятся не в той же папке, что и S-функция, и требуется добавить эти зависимости в make-файл, созданный во время генерации кода, создайте файл rtwmakecfg.m.

legacy_code('rtwmakecfg_generate', def);

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

После компиляции источника S-функции C-MEX снова можно вызвать функцию legacy_code (). Установите первый вход в «slblock _ generate», чтобы создать маскированный блок S-функции, вызывающий эту S-функцию. Программа помещает блок в новую модель. Блок можно скопировать в существующую модель.

legacy_code('slblock_generate', def);

Показать созданную интеграцию с устаревшим кодом

В rtwdemo_lct_fixpt_params модели показана интеграция модели с унаследованным кодом. Подсистема SunFixpt служит в качестве электрического жгута для вызова унаследованной функции C через сгенерированную S-функцию.

open_system('rtwdemo_lct_fixpt_params')
open_system('rtwdemo_lct_fixpt_params/TestFixpt')
sim('rtwdemo_lct_fixpt_params')

См. также

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