Встраивание S-функций

Встраивание S-функции

Встраивать S-функцию означает обеспечивать файл TLC для Блока s-function, который заменит C, C++, Фортран или версию языка MATLAB® блока, который использовался в процессе моделирования.

Невстроенная S-функция

Если встраивание, которое файл TLC не обеспечивается, большинство целей, поддерживает блок путем перекомпиляции S-функции MEX C для блока. Как обсуждено ранее, существуют издержки в использовании памяти, и скорость при использовании C/C++ закодировала S-функцию и ограниченное подмножество mx* Вызовы API поддержаны в контексте генератора кода. Если вы хотите самый эффективный сгенерированный код, необходимо встроить S-функции путем записывания файла TLC для них.

Когда симуляция должна выполнить одну из функций для Блока s-function, это вызывает файл MEX для этой функции. Когда генератор кода выполняет невстроенную S-функцию, он делает так подобным образом, как эта схема иллюстрирует.

Типы встраивания

Полезно задать две категории встраивания:

  • Полностью встроенные S-функции

  • Обертка встроила S-функции

В то время как и встроенный S-функция и удаляет издержки невстроенной S-функции, два подхода отличаются. Первый пример ниже, с помощью timestwo.tlc, рассматривается полностью встроенным файлом TLC, где полное внедрение блока содержится в файле TLC для блока.

Второй пример использует обертку файл TLC. Вместо того, чтобы генерировать алгоритмический код на месте, этот пример вызывает функцию C, которая содержит тело кода. Существует несколько потенциальных выгод для использования обертки файл TLC:

  • Это обеспечивает путь к S-функции MEX C и сгенерированному коду, чтобы совместно использовать код С. Вы не должны писать код дважды.

  • Вызванная функция C является оптимизированной стандартной программой.

  • Несколько из блоков могут существовать в модели, и более эффективно в терминах размера кода сделать, чтобы они вызвали функцию, в противоположность каждому создающему идентичному алгоритмическому коду.

  • Это обеспечивает способ включить устаревший код С беспрепятственно в сгенерированный код.

Полностью встроенный пример S-функции

Встраивание S-функции предоставляет механизм непосредственно встроенному коду для Блока s-function в сгенерированный код для модели. Вместо того, чтобы вызвать в отдельный исходный файл через указатели функции и обеспечить отдельную структуру данных (SimStruct) для него код кажется “встроенным”, когда следующий рисунок показывает.

S-функция timestwo.c обеспечивает простой пример полностью встроенной S-функции. Этот блок умножает свой вход на 2 и выводит его. Версия MEX C блока находится в файле matlabroot/toolbox/simulink/simdemos/simfeatures/src/timestwo.c, и встраиванием файл TLC для блока является matlabroot/toolbox/simulink/simdemos/simfeatures/tlc_c/timestwo.tlc.

timestwo.tlc

%implements "timestwo" "C"

%% Function: Outputs ==========================================
%%
%function Outputs(block, system) Output
  /* %<Type> Block: %<Name> */
  %%
  /* Multiply input by two */
  %assign rollVars = ["U", "Y"]
  %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars
    %<LibBlockOutputSignal(0, "", lcv, idx)> = \
    %<LibBlockInputSignal(0, "", lcv, idx)> * 2.0;
  %endroll
%endfunction

Анализ блока TLC

%implements директива требуется файлами блока TLC и используется целевым Языковым компилятором, чтобы проверить тип блока и язык, поддержанный блоком. %function директива запускает объявление функции и показывает имя функции, Outputs, и аргументы передали ему, block и system. Это соответствующие записи от model.rtw файл для этого экземпляра блока.

Последней частью прототипа является Output. Это означает, что любая линия, которая не является директивой TLC, выводится функцией к текущему файлу, который выбран в TLC. Так, ненаправленные линии в Outputs функционируйте становятся сгенерированным кодом для блока.

Самой сложной частью этого примера блока TLC является %roll директива. TLC использует эту директиву, чтобы обеспечить автоматическую генерацию for циклы, в зависимости от ширин ввода/вывода и непрерывны ли входные параметры в памяти. Этот пример использует типичную форму доступа к выходным параметрам и вводит из тела списка, с помощью LibBlockOutputSignal и LibBlockInputSignal получить доступ к выходным параметрам и входным параметрам и выполнить умножение и присвоение. Обратите внимание на то, что этот файл TLC поддерживает любую допустимую ширину сигнала.

Единственной функцией, используемой, чтобы реализовать этот блок, является Outputs. Для более сложных блоков другие функции объявляются также. Можно найти примеры более сложного встраивания файлами TLC в папках matlabroot/toolbox/simulink/simdemos/simfeatures/tlc_c (открытый) и matlabroot/toolbox/simulink/blocks/tlc_c (открытый), и путем рассмотрения кода для встроенных блоков в папке matlabroot/rtw/c/tlc/blocks открытый.

timestwo Модель

Эта простая модель использует timestwo S-функция и показывает MdlOutputs функция от сгенерированного modelC файл, который содержит встроенный код S-функции.

Выходной код модели

/* Model output function */
static void timestwo_ex_output(int_T tid)
{

  /* S-Function Block: <Root>/S-Function */
  /* Multiply input by two */
  timestwo_ex_B.timestwo_output = timestwo_ex_P.Constant_Value 
	 * 2.0;

  /* Outport: '<Root>/Out1' */
  timestwo_ex_Y.Out1 = timestwo_ex_B.timestwo_output;
}

Обертка встроенный пример S-функции

Следующая схема иллюстрирует встраивание S-функции как обертка. Алгоритм непосредственно называется из сгенерированного типового кодекса, удаляя S-функцию наверху, но обеспечивая функцию пользователя.

Это - встраивание файл TLC для версии обертки timestwo блок.

%implements "timestwo" "C"

%% Function: BlockTypeSetup ==================================
%%
%function BlockTypeSetup(block, system) void
  %% Add function prototype to model's header file
  %<LibCacheFunctionPrototype...
   ("extern void mytimestwo(real_T* in,real_T* out,int_T els);")>
  %% Add file that contains "myfile" to list of files to be compiled
  %<LibAddToModelSources("myfile")>
%endfunction

%% Function: Outputs ==========================================
%%
%function Outputs(block, system) Output
  /* %<Type> Block: %<Name> */
  %assign outPtr = LibBlockOutputSignalAddr(0, "", "", 0)
  %assign inPtr = LibBlockInputSignalAddr(0, "", "",0)
  %assign numEls = LibBlockOutputSignalWidth(0)
  /* Multiply input by two */
  mytimestwo(%<inPtr>,%<outPtr>,%<numEls>);
  
%endfunction

Анализ

Функциональный BlockTypeSetup называется однажды для каждого типа блока в модели; это не производит выход непосредственно как Outputs функция. Используйте BlockTypeSetup включать прототипа функции в modelH файл и сказать процессу сборки компилировать дополнительный файл, myfile.c.

Вместо того, чтобы выполнить умножение непосредственно, Outputs функционируйте теперь вызывает функциональный mytimestwo. Все экземпляры этого блока в модели вызывают ту же функцию, чтобы выполнить умножение. Получившаяся функция модели, MdlOutputs, затем становится

static void timestwo_ex_output(int_T tid)
{
  /* S-Function Block: <Root>/S-Function */
  /* Multiply input by two */
  mytimestwo(&model_B.Constant_Value,&model_B.S_Function,1);

  /* Outport Block: <Root>/Out1 */
model_Y.Out1 = model_B.S_Function;
}

Похожие темы