Сгенерируйте входящий код С из кода MATLAB

Об этом руководстве

Цели обучения

В этом руководстве показано, как:

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

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

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

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

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

Примечание

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

Необходимые условия

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

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

НапечататьИмяОписание
Код функцииmatrix_exp.mФункция MATLAB, которая вычисляет матричные экспоненциалы матрицы входа с помощью ряда Тейлора и возвращает вычисленные выходы.
Основная функция Cmain.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 - полный путь к рабочей папке, содержащей ваши файлы.

Об примере

В этом примере требуются библиотеки, специфичные для Microsoft® Операционная система Windows и, следовательно, работает только на платформах 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)

Вызов повторно входящего кода с постоянными данными в UNIX

Входящий код вызова - многопоточный с постоянными данными (только для UNIX)