Этот пример показывает несколько методов для интеграции наследия C функции в сгенерированный код. Эти методы создают S-функцию или звонят внешней функции C. Для получения дополнительной информации о S-функциях смотрите S-функции и Генерацию кода.
extern double add(double, double); #include "add.h" double add(double u1, double u2) { double y1; y1 = u1 + u2; return (y1); }
Используйте Legacy Code Tool, чтобы создать S-функцию и сгенерировать файл TLC. Программное обеспечение генерации кода использует файл TLC, чтобы сгенерировать код от этой S-функции. Преимущество для использования Legacy Code Tool состоит в том, что сгенерированный код полностью встраивается и не нуждается в функциях обертки, чтобы получить доступ к пользовательскому коду.
1. Создайте заголовочный файл C под названием add.h
это содержит функциональную подпись:
extern double add(double, double);
2. Создайте исходный файл C под названием add.c
это содержит тело функции:
double add(double u1, double u2) { double y1; y1 = u1 + u2; return (y1); }
3. Чтобы создать S-функцию для использования в симуляции и генерации кода, запустите следующий скрипт или выполните каждую из этих команд в командной строке MATLAB:
%% Initialize legacy code tool data structure def = legacy_code('initialize'); %% Specify Source File def.SourceFiles = {'add.c'}; %% Specify Header File def.HeaderFiles = {'add.h'}; %% Specify the Name of the generated S-function def.SFunctionName = 'add_function'; %% Create a c-mex file for S-function legacy_code('sfcn_cmex_generate', def); %% Define function signature and target the Output method def.OutputFcnSpec = ['double y1 = add(double u1, double u2)']; %% Compile/Mex and generate a block that can be used in simulation legacy_code('generate_for_sim', def); %% Create a TLC file for Code Generation legacy_code('sfcn_tlc_generate', def); %% Create a Masked S-function Block legacy_code('slblock_generate', def);
### Start Compiling add_function mex('-I/tmp/BR2019bd_1170825_64229/publish_examples5/tp2ae159be/ex61094511', '-c', '-outdir', '/tmp/BR2019bd_1170825_64229/publish_examples5/tpdb4e21b5_b246_44fc_9524_f1119fe5e7ae', '/tmp/BR2019bd_1170825_64229/publish_examples5/tp2ae159be/ex61094511/add.c') Building with 'gcc'. MEX completed successfully. mex('add_function.c', '-I/tmp/BR2019bd_1170825_64229/publish_examples5/tp2ae159be/ex61094511', '/tmp/BR2019bd_1170825_64229/publish_examples5/tpdb4e21b5_b246_44fc_9524_f1119fe5e7ae/add.o') Building with 'gcc'. MEX completed successfully. ### Finish Compiling add_function ### Exit
Выход этого скрипта производит:
Новая модель, содержащая Блок s-function.
Файл с именем TLC add_function.tlc
.
Исходный файл C под названием add_function.c
.
Файл с именем add_function.mexw32 mexw32 dll
.
4. Добавьте, что блоки импорта и выходной порт блокируют и устанавливают связи, как показано в модели.
5. Назовите и сохраните свою модель. В этом примере модель называют ex_function_call_lct
.
6. Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.
Этот код сгенерирован в ex_function_call_lct.c
:
/* Exported block signals */ real_T u1; /* '<Root>/u1' */ real_T u2; /* '<Root>/u2' */ /* External outputs (root outports fed by signals with default storage) */ ExternalOutputs rtY; /* Model step function */ void ex_function_call_lct_step(void) { /* Outport: '<Root>/y1' incorporates: * Inport: '<Root>/u1' * Inport: '<Root>/u2' * S-Function (add_function): '<Root>/add_function' */ rtY.y1 = add(u1, u2); }
Заданный пользователями заголовочный файл add.h
включен в ex_function_call_lct.h
:
#include "add.h"
1. Создайте заголовочный файл C под названием add.h
это содержит подпись функции, взятой в качестве примера. Обратитесь к предыдущему примеру.
2. Создайте исходный файл C под названием add.c
это содержит тело функции. Обратитесь к предыдущему примеру.
3. Добавьте, что блоки импорта и выходной порт блокируют и устанавливают связи, как показано в модели. В этом примере модель называют ex_function_call_SF
.
4. Дважды кликните диаграмму Stateflow и отредактируйте график как показано. Поместите вызов add
функция в рамках действия перехода.
5. Выберите Параметры конфигурации> Цель Симуляции> панель Пользовательского кода. В Том, чтобы включать пользовательский код С в сгенерированном разделе, на левой панели, избранном Заголовочном файле. В поле Заголовочного файла введите #include
оператор:
#include "add.h"
6. В Дополнительном разделе информации о сборке выберите Исходные файлы. В поле Исходных файлов, введите:
add.c
7. Выберите Параметры конфигурации> Цель Симуляции> Пользовательский код> Использование те же настройки пользовательского кода как Целевой параметр Симуляции.
8. Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.
ex_exfunction_call_SF.c
содержит следующий код в ступенчатой функции:
/* Definition for custom storage class: Global */ real_T u1; /* '<Root>/u1' */ real_T u2; /* '<Root>/u2' */ real_T y1; /* '<Root>/Chart' */ /* Model step function */ void ex_function_call_SF_step(void) { /* Chart: '<Root>/Chart' incorporates: * Inport: '<Root>/u1' * Inport: '<Root>/u2' */ y1 = (real_T)add(u1, u2); }
ex_exfunction_call_SF.h
содержит включать оператор для add.h
:
#include "add.h"
1. Создайте заголовочный файл C под названием add.h
это содержит подпись функции, взятой в качестве примера. Обратитесь к предыдущему примеру.
2. Создайте исходный файл C под названием add.c
это содержит тело функции. Обратитесь к предыдущему примеру.
3. В Браузере Библиотеки Simulink нажмите Simulink> User Defined Functions. Перетащите блок MATLAB function в свою модель.
4. Дважды кликните блок MATLAB function. Отредактируйте функцию, чтобы включать:
function y1 = add_function(u1, u2) % Set the class and size of output y1 = u1; % Call external C function y1 = coder.ceval('add',u1,u2); end
5. Выберите Параметры конфигурации> Цель Симуляции> панель Пользовательского кода. В Том, чтобы включать пользовательский код С в сгенерированном разделе, на левой панели, избранном Заголовочном файле. В поле Заголовочного файла введите #include
оператор:
#include "add.h"
6. В Дополнительном разделе информации о сборке выберите Исходные файлы. В поле Исходных файлов, введите:
add.c
7. Добавьте два блока Inport и один блок Outport к модели и соедините его с блоком MATLAB function.
8. Сохраните модель как ex_function_call_ML
.
9. Чтобы создать модель и сгенерировать код, нажмите Ctrl+B.
ex_exfunction_call_ML.c
содержит следующий код в ступенчатой функции:
/* Definition for custom storage class: Global */ real_T u1; /* '<Root>/u1' */ real_T u2; /* '<Root>/u2' */ real_T y1; /* '<Root>/MATLAB Function' */ /* Model step function */ void ex_function_call_ML_step(void) { /* MATLAB Function: '<Root>/MATLAB Function' incorporates: * Inport: '<Root>/u1' * Inport: '<Root>/u2' */ y1 = add(u1, u2); }
ex_exfunction_call_ML.h
содержит включать оператор для add.h
:
#include "add.h"