timesN
Учебный обзорObjective:, Чтобы изучить, как TLC работает с S-функцией.
Folder:
открытыйmatlabroot
/toolbox/rtw/rtwdemos/tlctutorial/timesN
В этом примере вы генерируете версии кода С для существующей S-функции timesN
.
Пример включает эти шаги:
Noninlined Code Generation — Через SimStructs и типовой API
Why Use TLC to Inline S-Functions? — Преимущества встраивания
Create an Inlined S-Function — С помощью пользовательского кода TLC
Более поздний пример предоставляет информацию и практику с “переносящимися” S-функциями.
Учебная папка tlctutorial/timesN
в вашей рабочей папке содержит Simulink® S-функция timesN.c
.
В этом осуществлении вы генерируете невстроенный код из модели sfun_xN
.
Найдите файл rename_timesN.tlc
в tlctutorial/timesN
. Переименуйте этот файл в timesN.tlc
. Это позволяет вам генерировать код.
В MATLAB® Командное окно, создайте файл MEX для S-функции:
mex timesN.c
Это старается не брать версию, поставленную с Simulink.
Откройте модель sfun_xN
, который использует timesN
S-функция. Блок-схема выглядит так.
Откройте диалоговое окно Configuration Parameters и выберите панель Solver.
Установите Stop time на 10.0
.
Установите Solver Options.
Type к Fixed-step
Solver к Discrete (no continuous states)
Fixed-step size к 0.01
Выберите панель Optimization и убедитесь, что Default parameter behavior установлен в Tunable
.
Выберите Code Generation> панель Comments и заметьте, что Include comments проверяется по умолчанию.
Выберите панель Code Generation и проверяйте Generate code only.
Нажмите Apply.
Нажмите Ctrl+B, чтобы сгенерировать код С для модели.
Откройте получившийся файл sfun_xN_grt_rtw/sfun_xN.c
и просмотрите sfun_xN_output
разделите на части, показанный ниже.
/* Model output function */ static void sfun_xN_output(int_T tid) { /* Sin: '<Root>/Sin' */ sfun_xN_B.Sin = sin(sfun_xN_M->Timing.t[0] * sfun_xN_P.Sin_Freq + sfun_xN_P.Sin_Phase) * sfun_xN_P.Sin_Amp + sfun_xN_P.Sin_Bias; /* S-Function Block: <Root>/S-Function */ /* Multiply input by 3.0 */ sfun_xN_B.timesN_output = sfun_xN_B.Sin * 3.0; /* Outport: '<Root>/Out' */ sfun_xN_Y.Out = sfun_xN_B.timesN_output; UNUSED_PARAMETER(tid); }
Комментарии появляются в коде, потому что, в Code Generation> панель Comments диалогового окна Configuration Parameters, Include comments выбран по умолчанию.
Генератор кода включает типовой API, который можно использовать, чтобы вызвать написанные пользователем алгоритмы и драйверы. API включает множество функций обратного вызова — для инициализации, выхода, производных, завершения, и так далее — а также структуры данных. После того, как закодированный, они инстанцируют в памяти и вызывают во время выполнения через косвенные вызовы функции. Каждый вызов включает стековые фреймы и другие издержки, которые добавляют ко времени выполнения.
В окружении реального времени, особенно когда много шагов решения включены, типовые вызовы API могут быть неприемлемо медленными. Генератор кода может ускорить S-функции в автономных приложениях, которые он генерирует путем встраивания написанных пользователем алгоритмов в автоматически сгенерированных функциях, вместо того, чтобы косвенно вызвать S-функции через типовой API. Эта форма оптимизации называется inlining. TLC встраивает S-функции, приводящие к быстрее, оптимизированный код.
Необходимо изучить, что TLC не является заменой для записи S-функций кода С. Чтобы вызвать пользовательские блоки в Simulink, все еще необходимо написать S-функции в C (или как файлы MATLAB), поскольку симуляции не используют файлы TLC. Можно, однако, подготовить файлы TLC, которые встраивают заданные S-функции, чтобы сделать целевой код намного более эффективным.
TLC создает inlined S-function каждый раз, когда он обнаруживает .tlc
файл с тем же именем как S-функция. Принятие .tlc
файл имеет ожидаемую форму, он направляет конструкцию кода, который функционально копирует внешнюю S-функцию, не подвергаясь API наверху. Смотрите, как этот процесс работает путем завершения следующих шагов:
Если вы поэтому уже не сделали, найдите файл rename_timesN.tlc
в tlctutorial/timesN
. Переименуйте этот файл в timesN.tlc
, таким образом, можно использовать его, чтобы сгенерировать код. Исполняемый фрагмент файла
%implements "timesN" "C" %% Function: Outputs =========================================================== %% %function Outputs(block, system) Output %assign gain =SFcnParamSettings.myGain /* %<Type> Block: %<Name> */ %% /* Multiply input by %<gain> */ %assign rollVars = ["U", "Y"] %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars %<LibBlockOutputSignal(0, "", lcv, idx)> = \ %<LibBlockInputSignal(0, "", lcv, idx)> * %<gain>; %endroll %endfunction
Создайте встроенную версию S-функции.
На панели Optimization диалогового окна Configuration Parameters, набор Default parameter behavior к Inlined
, и нажмите Apply.
Измените метку схемы от model: sfun_xN
к model: sfun_xN_ilp
.
Сохраните модель как sfun_x2_ilp
.
Нажмите Ctrl+B. Исходные файлы создаются в новой подпапке под названием sfun_xN_ilp_grt_rtw
.
Смотрите код в сгенерированном файле sfun_xN_ilp.c
:
/* Model output function */ static void sfun_xN_ilp_output(int_T tid) { /* Sin: '<Root>/Sin' */ sfun_xN_ilp_B.Sin = sin(sfun_xN_ilp_M->Timing.t[0]); /* S-Function Block: <Root>/S-Function */ /* Multiply input by 3.0 */ sfun_xN_ilp_B.timesN_output = sfun_xN_ilp_B.Sin * 3.0; /* Outport: '<Root>/Out' */ sfun_xN_ilp_Y.Out = sfun_xN_ilp_B.timesN_output; UNUSED_PARAMETER(tid); }
Примечание
Когда генератор кода производит код и создает исполняемые файлы, это создает или использует определенную подпапку (названный папкой сборки), чтобы содержать источник, объект и make-файлы. По умолчанию папку сборки называют
. model
_grt_rtw
Заметьте, что установка Default parameter behavior к Inlined
не изменил код. Это вызвано тем, что TLC встраивает S-функции.
Продолжите осуществление путем создания автономной симуляции.
В панели Code Generation диалогового окна Configuration Parameters очистите Generate code only и нажмите Apply.
В панели Data Import/Export диалогового окна Configuration Parameters проверяйте Output.
Эта спецификация заставляет выходные данные модели быть зарегистрированными ваше рабочее пространство MATLAB.
Нажмите Ctrl+B, чтобы сгенерировать код, скомпилировать и соединить модель в исполняемый файл, названный sfun_xN_ilp.exe
(или, на UNIX® системы, sfun_xN_ilp
).
Подтвердите что timesN.tlc
файл производит ожидаемый выведенный путем выполнения независимого исполняемого файла. Чтобы запуститься это, в командном окне MATLAB, вводит
!sfun_xN_ilp
Следующий ответ появляется:
** starting the model ** ** created sfun_xN_ilp.mat **
Просмотрите или постройте содержимое sfun_xN_ilp.mat
файл, чтобы проверить, что автономная модель сгенерировала синус выход в пределах от-3 к +3. В Командном Окне MATLAB введите
load sfun_xN_ilp.mat plot (rt_yout)
Совет
Для платформ UNIX запустите исполняемую программу в Командном окне с синтаксисом !./
executable_name
. Если предпочтено, запуск исполняемая программа от ОС окружают с синтаксисом ./
executable_name
. Для получения дополнительной информации смотрите Запуск Внешние Команды, Скрипты и Программы.