exponenta event banner

Генерировать повторно вводимый код C из кода MATLAB

Об этом учебном пособии

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

В этом учебном пособии показано, как:

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

  • Автоматическое создание кода C из кода 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. Это простой многопоточный пример, в котором не используются постоянные или глобальные данные. Два потока вызывают функцию MATLABmatrix_exp с различными наборами входных данных.

 Содержание matrix_exp.m

При создании повторно используемого кода повторного ввода кодер MATLAB поддерживает динамическое распределение:

  • Переменные функции, которые слишком велики для стека

  • Постоянные переменные

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

Кодер MATLAB генерирует файл заголовка, 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;

Создание кода C

Позвоните в codegen для создания кода C со следующими опциями:

  • -config для передачи в объект конфигурации генерации кода cfg.

  • main.c для включения этого файла в компиляцию.

  • -report для создания отчета о создании кода.

  • -args для указания класса, размера и сложности входных аргументов с использованием данных примера.

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

codegen генерирует исполняемый файл Си, matrix_exp.exe, в текущей папке и код C в /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)