Сгенерируйте повторно используемый код С из кода 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_nameStackData

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

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

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

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

  • primary_function_namePersistentData

    Если ваш алгоритм использует персистентные или глобальные переменные, 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)