В этом разделе показаны различные сценарии интегрирования внешнего кода.
В этом примере показано, как интегрировать код С++ в модель с помощью S-функций.
Откройте модель примера
Откройте пример модели rtwdemo_cpp
.
open_system('rtwdemo_cpp');
Сконфигурируйте компилятор C++
1. В Командном Окне MATLAB введите эту команду:
mex -setup
2. Когда появится запрос, выберите компилятор C++, который установлен на вашем компьютере разработчика.
Интеграция кода С++
Можно интегрировать код С++ в модель с помощью S-функций.
1. Подготовьте источник S-функции.
2. Откройте приложение Simulink Coder или Embedded Coder.
3. Сконфигурируйте исходные файлы и папки S-функций. Откройте диалоговое окно Параметра конфигурации модели, перейдите к панели Генерации кода > Пользовательский Код и добавьте исходные файлы S-функции и include
папки.
4. Встроите S-функцию, чтобы исключить накладные расходы на S-функции в сгенерированном коде.
Откройте sfun_cppcount_cpp.tlc
Сконфигурируйте модель для генерации кода С++
Установите параметр конфигурации модели Language на C++
.
Сгенерируйте и проверьте код.
Сгенерируйте и измените код С++.
Похожие темы
В этом примере показано, как использовать Stateflow ® для интеграции внешнего кода в модель.
Откройте модель
model='rtwdemo_sfcustom';
open_system(model);
Интеграция кода
1. Пример включает пользовательский файл заголовка my_header.c
и пользовательский исходный файл my_function.c
.
%Open files my_header.h and my_function.c eval('edit my_header.h') eval('edit my_function.c')
2. В диалоговом окне Model Параметры Конфигурации панели Simulation Target введите пользовательский исходный файл и файл заголовка. Также введите дополнительные директории и исходные файлы.
В этом примере пользовательский файл заголовка my_header.c
и исходный файл my_function.c
вводятся на панели Цель симуляции (Simulation Target).
%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);
3. Чтобы сгенерировать код, в диалоговом окне Model Configuration Parameters, Генерация кода > Панель Пользовательский код, введите тот же пользовательский исходный файл и файл заголовка. Также введите те же дополнительные директории и исходные файлы.
В этом примере пользовательский файл заголовка my_header.c
и исходный файл my_function.c
вводятся на панели «Генерация кода» > «Пользовательский код».
Откройте панель Генерация Кода > Custom Code диалогового окна Model Configuration Parameters.
configSet = getActiveConfigSet(model); openDialog(configSet);
Сгенерируйте код
slbuild('rtwdemo_sfcustom')
### Starting build procedure for: rtwdemo_sfcustom ### Successful completion of build procedure for: rtwdemo_sfcustom Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= rtwdemo_sfcustom Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.8965s
Вызов кода С из Stateflow
Чтобы вызвать пользовательские функции кода С из Stateflow, используйте тот же синтаксис, что и вызовы графических функций: result = my_custom_function(in_args);
Чтобы вызвать переменные типа структуры, используйте запись через точку: result = my_var.my_field;
См. также
Закройте модель
rtwdemoclean;
close_system('rtwdemo_sfcustom',0);
В этом примере показано, как поместить внешний код в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.
1. Откройте модель rtwdemo_slcustcode
.
open_system('rtwdemo_slcustcode')
2. Откройте приложение Simulink Coder или Embedded Coder.
3. Откройте диалоговое окно Model Параметры Конфигурации и перейдите к панели Custom Code.
4. Исследуйте настройки параметров конфигурации модели Исходный файл и функцию Initialize.
Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2
по -1.
Функция Initialize инициализирует переменную GLOBAL_INT2
по 1.
5. Закройте диалоговое окно.
6. Дважды кликните Исходный блок модели. Параметры блоков Top of Model Source задают, что генератор кода объявляет переменную GLOBAL_INT1
и установите его равным 0 в верхней части сгенерированного файла rtwdemo_slcustcode.c
.
7. Откройте триггируемую подсистему Amplifier
. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в этом блоке, в сгенерированный код для ближайшей родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier
подсистема. Внешний код:
Объявляет переменную указателя *intPtr
и инициализирует его со значением переменной GLOBAL_INT1
.
Устанавливает переменную указателя на -1 во время выполнения.
Устанавливает значение переменной указателя 0 перед выходом.
8. Сгенерируйте код и отчет генерации кода.
9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c
. В верхней части файла, после #include
операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации исходного файла и второе объявление с блоком Model Source.
int_T GLOBAL_INT2 = -1;
int_T GLOBAL_INT1 = 0;
Область Выходной функции для Amplifier
подсистема включает следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет коэффициент усиления. Пример задает три строки кода для переменной указателя с блоком System Outputs в Amplifier
подсистема.
int_T *intPtr = &GLOBAL_INT1;
*intPtr = -1;
rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;
*intPtr = 0;
Следующее назначение появляется в модели initialize функции точки входа. Пример задает это назначение с помощью параметра конфигурации Initialize function.
GLOBAL_INT2 = 1;
В этом примере показано, как поместить внешний код в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.
1. Откройте модель rtwdemo_slcustcode
.
open_system('rtwdemo_slcustcode')
2. Откройте приложение Simulink Coder или Embedded Coder.
3. Откройте диалоговое окно Model Параметры Конфигурации и перейдите к панели Custom Code.
4. Исследуйте настройки параметров конфигурации модели Исходный файл и функцию Initialize.
Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2
по -1.
Функция Initialize инициализирует переменную GLOBAL_INT2
по 1.
5. Закройте диалоговое окно.
6. Дважды кликните Исходный блок модели. Параметры блоков Top of Model Source задают, что генератор кода объявляет переменную GLOBAL_INT1
и установите его равным 0 в верхней части сгенерированного файла rtwdemo_slcustcode.c
.
7. Откройте триггируемую подсистему Amplifier
. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в этом блоке, в сгенерированный код для ближайшей родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier
подсистема. Внешний код:
Объявляет переменную указателя *intPtr
и инициализирует его со значением переменной GLOBAL_INT1
.
Устанавливает переменную указателя на -1 во время выполнения.
Устанавливает значение переменной указателя 0 перед выходом.
8. Сгенерируйте код и отчет генерации кода.
9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c
. В верхней части файла, после #include
операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации исходного файла и второе объявление с блоком Model Source.
int_T GLOBAL_INT2 = -1;
int_T GLOBAL_INT1 = 0;
Область Выходной функции для Amplifier
подсистема включает следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет коэффициент усиления. Пример задает три строки кода для переменной указателя с блоком System Outputs в Amplifier
подсистема.
int_T *intPtr = &GLOBAL_INT1;
*intPtr = -1;
rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;
*intPtr = 0;
Следующее назначение появляется в модели initialize функции точки входа. Пример задает это назначение с помощью параметра конфигурации Initialize function.
GLOBAL_INT2 = 1;
В этом примере показано, как использовать Stateflow ® для интеграции внешнего кода С++ в модель.
Откройте модель
model='rtwdemo_sfcpp';
open_system(model);
Чтобы настроить компилятор C++, в командной строке введите mex -setup
.
Интеграция кода С++
1. Создайте функции оболочки C-стиля или получите доступ к макросам для каждого метода, вызываемого из языка действий C.
%Open example wrapper functions. filename=fullfile(matlabroot, 'toolbox', 'rtw', 'rtwdemos', 'custom_cpp_src', 'adder_cpp.cpp'); eval('edit(filename)'); clear filename; filename=fullfile(matlabroot, 'toolbox', 'rtw', 'rtwdemos', 'custom_cpp_src', 'adder_cpp.h'); eval('edit(filename)'); clear filename;
2. В диалоговом окне «Параметры конфигурации» «Генерация кода» > «Пользовательский код» введите исходные файлы S-функции и включите директории.
%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);
3. В диалоговом окне Параметры конфигурации Simulation Target > панель Пользовательский код введите исходные файлы S-функции и включите директории.
%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);
Сгенерируйте код С++
В диалоговом окне Параметров конфигурации Генерации кода задайте значение Language C++
. Чтобы сгенерировать код, выберите Build.
%Open Configuration Parameters dialog box configSet = getActiveConfigSet(model); openDialog(configSet); clear model;
См. также
Закройте модель
rtwdemoclean;
close_system('rtwdemo_sfcpp',0);