Цели генерируемого кода обычно включают компактность и скорость. С другой стороны, S-функции - это загружаемые во время выполнения модули расширения для добавления функциональных возможностей блочного уровня к Simulink ®. По существу, S-функциональный интерфейс оптимизирован для гибкости в конфигурировании и использовании блоков в среде моделирования с возможностью обеспечения внесения изменений во время выполнения в работу блока через параметры. Эти изменения обычно принимают форму выбора алгоритма и числовых констант для блочных алгоритмов.
Хотя алгоритмы переключения являются желательной особенностью на этапе проектирования системы, когда приходит время генерировать код, этот тип гибкости часто падает в пользу оптимальной скорости вычисления и размера кода. Компилятор целевого языка предназначен для создания компактного и быстрого кода путем выборочного создания только кода, необходимого для одного экземпляра набора параметров блока.
Вы можете принять решение не вставлять S-функции C MEX, которые имеют:
Мало числовых параметров или нет.
Один алгоритм, который уже зафиксирован в способности. Например, он не имеет дополнительных режимов или альтернативных алгоритмов.
Поддержка только одного типа данных.
Значительный или большой размер кода в mdlOutputs() функция.
Несколько экземпляров блока S-Function в моделях.
Всякий раз, когда вы сталкиваетесь с этой ситуацией, попытка встроить блок может не улучшить скорость выполнения и фактически увеличить размер генерируемого кода. Компромисс находится в размере кода тела блока, сгенерированного для каждого экземпляра, по сравнению с размером дочернего SimStruct, созданного для каждого экземпляра неинлинной S-функции в сгенерированном коде.
В качестве альтернативы можно использовать гибридный метод встраивания, известный как S-функция С-MEX, где целевой файл блока просто генерирует вызов пользовательской кодовой функции, которую сама S-функция также вызывает. Этот подход может быть оптимальным решением для генерации кода в случае большого фрагмента существующего кода. Описание процедуры и пример обернутой S-функции см. в разделах Write Wrapper S-Function и TLC-Files.
Стратегия улучшения кода из блоков основана на определении того, какая часть операций блока активна и используется в сгенерированном коде и какие части могут быть предопределены или исключены.
На практике это означает, что TLC-код в целевом файле блока выберет алгоритм, который является подмножеством алгоритмов, содержащихся в самой S-функции, и затем избирательно жестко кодирует числовые параметры, которые не подлежат изменению во время выполнения. Это уменьшает размер памяти кода и приводит к коду, который часто намного быстрее, чем его S-функциональный аналог, когда выбор режима является значительной частью обработки S-функции. Кроме того, накладные расходы на вызов функции исключаются для встроенных S-функций, поскольку код генерируется непосредственно в теле кода, если в сгенерированном коде нет явного вызова библиотечной функции.
Выбор алгоритма и параметры для каждого блока выводятся в начальной фазе процесса формирования кода из зарегистрированного набора параметров S-функции или mdlRTW() функция (если присутствует), которая приводит к записям в модели .rtw для этого блока во время генерации кода. Затем вызывается файл, написанный на целевом языке для блока, для считывания записей в и вычислить сгенерированный код для этого экземпляра блока. Этот код TLC содержится в целевом файле блока.model.rtw
Один особый случай для встроенных S-функций - это случай блоков ввода-вывода и драйверов, таких как аналого-цифровые преобразователи или порты связи. Для моделирования драйвер ввода-вывода обычно кодируется в S-функции как чистый источник, сквозной канал или чистый приемник. Однако в сгенерированном коде должен быть создан фактический интерфейс с устройством ввода-вывода, обычно посредством прямого кодирования с общим _in(), _out() функции, встроенный код сборки или определенный набор вызовов библиотеки ввода-вывода, уникальных для устройства и целевой среды.
Компилятор целевого языка использует следующий порядок поиска для поиска файлов TLC:
Текущая папка.
Расположения, указанные %addincludepath директивы. Компилятор оценивает несколько %addincludepath директивы снизу вверх.
Расположения, указанные -I варианты. Компилятор оценивает несколько -I справа налево.
Для встроенных файлов TLC S-функций процесс сборки поддерживает следующие расположения:
Папка, в которой находится исполняемый файл S-функции (MEX или MATLAB ®).
Подпапка папки S-функций ./tlc_c (для целевых языков C или C++).
Текущая папка при запуске процесса построения.
Примечание
Примечание.Размещение встроенного файла S-функции TLC в другом месте не поддерживается, даже если местоположение находится в пути включения TLC.
При обработке S-функции используется первый конечный файл с требуемым именем, реализующий указанный язык запись файла. model.rtw
Примечание
Компилятор не выполняет поиск по пути MATLAB и не находит файл, доступный только по этому пути. Компилятор выполняет поиск только описанных выше расположений.
S-функции могут быть написаны на языке MATLAB, Fortran, C и C++. Включение TLC S-функций доступно, как показано в этой таблице.
Встроенная поддержка TLC по типу S-функции
| Тип S-функции | Поддержка неинлайнинга | Поддерживается встраивание |
|---|---|---|
Язык MATLAB | Нет | Да |
Фортран MEX | Нет | Да |
C | Да | Да |
C++ | Да | Да |