Сгенерируйте повторно используемый код С из кода MATLAB

Об этом примере

Изучение целей

Этот пример показывает вам как:

  • Сгенерируйте повторно используемый код из кода MATLAB®, который не использует персистентные или глобальные данные.

  • Автоматически сгенерируйте код С из своего кода MATLAB.

  • Задайте свойства входного параметра функции в командной строке.

  • Задайте свойства генерации кода.

  • Сгенерируйте генерацию кода, сообщают, что можно использовать для представления и отладить код MATLAB.

Примечание

Этот пример работает на Windows® только.

Предпосылки

Чтобы завершить этот пример, установите следующие продукты:

Необходимые файлы

ВводИмяОписание
Функциональный кодmatrix_exp.mФункция MATLAB, которая вычисляет матричный экспоненциал входной матрицы, использующей Ряд Тейлора, и возвращает вычисленный выходной параметр.
C основная функцияmain.c Вызывает повторно используемый код.

Копирование файлов локально

Скопируйте учебные файлы в локальную рабочую папку.

  1. Создайте локальную рабочую папку, например, c:\coder\work.

  2. Изменитесь на папку matlabroot\help\toolbox\coder\examples. В команде MATLAB запрашивают, введите:

    cd(fullfile(docroot, 'toolbox', 'coder', 'examples'))
    

  3. Скопируйте папку reentrant_win в свою локальную рабочую папку.

    Ваша папка работы теперь содержит файлы для примера.

  4. Установите свою текущую папку MATLAB на папку работы, которая содержит ваши файлы для этого примера. В команде MATLAB запрашивают, введите:

    cd work

    work является полным путем папки работы, содержащей ваши файлы.

О примере

Этот пример требует библиотек, которые характерны для операционной системы Windows Microsoft® и, поэтому, выполнения только на платформах Windows. Это - простой, многопоточный пример, который не использует персистентные или глобальные данные. Два потока вызывают функцию MATLAB matrix_exp с различными наборами входных данных.

 Содержимое matrix_exp.m

Когда вы генерируете допускающий повторное использование, повторно используемый код, MATLAB Coder поддерживает динамическое выделение:

  • Функциональные переменные, которые являются слишком большими для стека

  • Персистентные переменные

  • Глобальные переменные

MATLAB Coder генерирует заголовочный файл, primary_function_name _types.h, который необходимо включать при использовании сгенерированного кода. Этот заголовочный файл содержит следующие структуры:

  • primary_function_name StackData

    Содержит выделенную память пользователя. Передайте указатель на эту структуру как первый параметр к функциям, которые используют его:

    • Непосредственно (функция использует поле в структуре),

    • Косвенно (функция передает структуру вызванной функции),

    Если алгоритм использует персистентные или глобальные данные, структура StackData primary_function_name также содержит указатель на структуру PersistentData primary_function_name. Если вы включаете этот указатель, необходимо передать только один параметр каждой вызывающей функции.

  • primary_function_name PersistentData

    Если ваш алгоритм использует персистентные или глобальные переменные, MATLAB Coder предоставляет отдельную структуру им. Структура выделения памяти содержит указатель на эту персистентную структуру данных. Поскольку у вас есть отдельная структура для персистентных и глобальных переменных, можно выделить память для этих переменных однажды и совместно использовать их со всеми потоками. Однако, если потоки не связываются, можно выделить память для этих переменных на поток.

Обеспечение основной Функции C

Чтобы вызвать повторно используемый код, обеспечьте функцию main что:

  • Включает сгенерированный заголовочный файл matrix_exp.h. Этот файл включает сгенерированный заголовочный файл, matrix_exp_types.h.

  • Для каждого потока, выделяет память для данных о стеке.

  • Вызывает функцию обслуживания matrix_exp_initialize. Для получения дополнительной информации смотрите, что Вызов Инициализирует и Отключает Функции.

  • Вызовы matrix_exp.

  • Вызовы matrix_exp_terminate.

  • Освобождает для памяти данных стека.

 Содержимое main.c

Конфигурирование параметров сборки

Можно включить генерацию повторно используемого кода с помощью объекта настройки генерации кода.

  1. Создайте объект настройки.

    cfg = coder.config('exe');

  2. Включите повторно используемую генерацию кода.

    cfg.MultiInstanceCode = true;

Генерация кода С

Вызовите функцию codegen, чтобы сгенерировать код С со следующими опциями:

  • -config, чтобы передать в объекте cfg настройки генерации кода.

  • main.c, чтобы включать этот файл в компиляцию.

  • -report, чтобы создать отчет генерации кода.

  • -args, чтобы задать класс, размер и сложность входных параметров с помощью данных в качестве примера.

codegen -config cfg main.c -report matrix_exp.m -args ones(160,160)

codegen генерирует исполняемый файл C, matrix_exp.exe, в текущей папке и коде С в подпапке /codegen/exe/matrix_exp. Поскольку вы выбрали генерацию отчета, codegen обеспечивает ссылку на отчет.

Просмотр сгенерированного кода C

codegen генерирует заголовочный файл matrix_exp_types.h, который задает глобальную структуру matrix_expStackData. Эта структура содержит локальные переменные, которые являются слишком большими, чтобы соответствовать на стеке.

Просмотреть этот заголовочный файл:

  1. Щелкните по ссылке View report, чтобы открыть отчет генерации кода.

  2. В списке сгенерированных файлов нажмите matrix_exp_types.h.

/*
 * matrix_exp_types.h
 *
 * Code generation for function 'matrix_exp'
 *
 */

#ifndef __MATRIX_EXP_TYPES_H__
#define __MATRIX_EXP_TYPES_H__

/* Include files */
#include "rtwtypes.h"

/* Type Definitions */
#ifndef typedef_matrix_expStackData
#define typedef_matrix_expStackData

typedef struct {
  struct {
    double F[25600];
    double Y[25600];
    double X[25600];
  } f0;
} matrix_expStackData;

#endif                                 /*typedef_matrix_expStackData*/
#endif

/* End of code generation (matrix_exp_types.h) */

Выполнение кода

Проверьте, что пример работает на платформах Windows, и вызовите код.

% This example can only be run on Windows platforms
if ~ispc
 error('This example requires Windows-specific libraries and can only be run on Windows.');
end
system('matrix_exp.exe')

Исполняемое завершение выполнений и отчетов.

Ключевые пункты, чтобы помнить

  • Создайте функцию main что:

    • Включает сгенерированный заголовочный файл, primary_function_name _types.h. Этот файл задает глобальную структуру primary_function_nameStackData. Эта структура содержит локальные переменные, которые являются слишком большими, чтобы соответствовать на стеке.

    • Для каждого потока, выделяет память для данных о стеке.

    • Вызовы primary_function_name_initialize.

    • Вызовы primary_function_name.

    • Вызовы primary_function_name_terminate.

    • Освобождает память данных стека.

  • Используйте опцию -config, чтобы передать объект настройки генерации кода функции codegen.

  • Используйте опцию -args, чтобы задать входные параметры в командной строке.

  • Используйте опцию -report, чтобы создать отчет генерации кода.

Узнать больше

КСмотрите

Узнайте больше о API сгенерированного кода

API для сгенерированного повторно используемого кода

Вызовите повторно используемый код без персистентных или глобальных данных на UNIX®

Вызовите повторно используемый код без персистентных или глобальных данных (только UNIX)

Вызовите повторно используемый код с персистентными данными по Windows

Вызовите повторно используемый код — многопоточный с персистентными данными (Windows Only)

Вызовите повторно используемый код с персистентными данными по UNIX

Вызовите повторно используемый код — многопоточный с персистентными данными (только UNIX)