Внешние функции C

Этот пример показывает несколько методов для интеграции наследия C функции в сгенерированный код. Эти методы создают S-функцию или звонят внешней функции C. Для получения дополнительной информации о S-функциях смотрите S-функции и Генерацию кода.

C построение

extern double add(double, double);

#include "add.h"
double add(double u1, double u2)
{
   double y1;
   y1 = u1 + u2;
   return (y1);
}

Создайте S-функции при помощи Legacy Code Tool

Используйте 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/BR2020ad_1316498_123416/publish_examples0/tpcbde8dc0/ex61094511', '-c', '-outdir', '/tmp/BR2020ad_1316498_123416/publish_examples0/tp802d3f9c_0280_433e_ab80_4a0f7d42a559', '/tmp/BR2020ad_1316498_123416/publish_examples0/tpcbde8dc0/ex61094511/add.c')
Building with 'gcc'.
MEX completed successfully.
    mex('add_function.c', '-I/tmp/BR2020ad_1316498_123416/publish_examples0/tpcbde8dc0/ex61094511', '/tmp/BR2020ad_1316498_123416/publish_examples0/tp802d3f9c_0280_433e_ab80_4a0f7d42a559/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"

Вызовите функции C при помощи диаграммы Stateflow

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"

Используйте блок MATLAB function, чтобы вызвать функции C

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"

Связанные примеры

Больше о