В этом руководстве показано, как:
Сгенерируйте входящий код из MATLAB® код, который не использует постоянные или глобальные данные.
Автоматически сгенерируйте код С из кода MATLAB.
Задайте входной параметр функции свойства в командной строке.
Задайте свойства генерации кода.
Сгенерируйте отчет генерации кода, который можно использовать для просмотра и отладки кода MATLAB.
Примечание
Этот пример работает в Windows® только.
Чтобы завершить этот пример, установите следующие продукты:
MATLAB
MATLAB Coder™
Компилятор C
MATLAB Coder находит и использует поддерживаемый установленный компилятор. Текущий список поддерживаемых компиляторов см. в Поддерживаемые и совместимые компиляторы на MathWorks® веб-сайт.
Можно использовать mex -setup
для изменения компилятора по умолчанию. См. Раздел «Изменение компилятора по умолчанию».
Напечатать | Имя | Описание |
---|---|---|
Код функции | matrix_exp.m | Функция MATLAB, которая вычисляет матричные экспоненциалы матрицы входа с помощью ряда Тейлора и возвращает вычисленные выходы. |
Основная функция C | main.c | Вызывает повторяющийся код. |
Скопируйте файлы учебника в локальную рабочую папку.
Создайте локальную рабочую папку, например c:\coder\work
.
Измените на matlabroot\help\toolbox\coder\examples
папка. В командной строке MATLAB введите:
cd(fullfile(docroot, 'toolbox', 'coder', 'examples'))
Скопируйте reentrant_win
папка в локальную рабочую папку.
Теперь ваша рабочая папка содержит файлы для руководства.
Установите текущую папку MATLAB в рабочую папку, содержащую ваши файлы для этого руководства. В командной строке MATLAB введите:
cd work
work
- полный путь к рабочей папке, содержащей ваши файлы.
В этом примере требуются библиотеки, специфичные для Microsoft® Операционная система Windows и, следовательно, работает только на платформах Windows. Это простой многопоточный пример, который не использует постоянные или глобальные данные. Два потока вызывают функцию MATLAB matrix_exp
с различными наборами входных данных.
Когда вы генерируете повторно используемый, повторно входящий код, MATLAB Coder поддерживает динамическое выделение:
Функциональные переменные, которые являются слишком большими для стека
Постоянные переменные
Глобальные переменные
MATLAB Coder генерирует заголовочный файл, primary_function_name
_types.h
, которые вы должны включить при использовании сгенерированного кода. Этот файл заголовка содержит следующие структуры:
primary_function_name
StackData
Содержит выделенную пользователем память. Передайте указатель на эту структуру как первый параметр на функции, которые ее используют:
Непосредственно (функция использует поле в структуре)
Косвенно (функция передает структуру вызываемой функции)
Если алгоритм использует постоянные или глобальные данные, primary_function_name
StackData
структура также содержит указатель на primary_function_name
PersistentData
структура. Если вы включаете этот указатель, вы должны передать только один параметр каждой вызывающей функции.
primary_function_name
PersistentData
Если ваш алгоритм использует постоянные или глобальные переменные, MATLAB Coder предоставляет для них отдельную структуру. Структура выделения памяти содержит указатель на эту постоянную структуру данных. Поскольку у вас есть отдельная структура для стойких и глобальных переменных, можно выделять память для этих переменных один раз и делиться ими со всеми потоками. Однако, если потоки не взаимодействуют, можно выделить память для этих переменных на каждый поток.
Чтобы вызвать входящий код, укажите main
функция, которая:
Включает сгенерированный файл заголовка matrix_exp.h
. Этот файл включает сгенерированный файл заголовка, matrix_exp_types.h
.
Для каждого потока выделяет память для данных стека.
Вызывает matrix_exp_initialize
функции домашнего хозяйства. Дополнительные сведения см. в разделе Развертывание сгенерированного кода.
Вызовы matrix_exp
.
Вызовы matrix_exp_terminate
.
Освобождает память для стека данных.
Вы можете включить генерацию повторного кода с помощью объекта строения генерации кода.
Создайте объект строения.
cfg = coder.config('exe');
Включите генерацию кода повторного входа.
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
содержит ссылку на отчет.
codegen
генерирует заголовочный файл matrix_exp_types.h
, который определяет matrix_expStackData
глобальная структура. Эта структура содержит локальные переменные, которые являются слишком большими, чтобы помещаться в стек.
Чтобы просмотреть этот файл заголовка:
Нажмите на View report
ссылка для открытия отчета генерации кода.
В списке сгенерированных файлов нажмите 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 | |
Вызов повторно входящего кода без постоянных или глобальных данных в UNIX® | Вызов входящего кода без постоянных или глобальных данных (только для UNIX) |
Вызов повторно входящего кода с постоянными данными в Windows | Входящий код вызова - многопоточный с постоянными данными (только для Windows) |
Вызов повторно входящего кода с постоянными данными в UNIX | Входящий код вызова - многопоточный с постоянными данными (только для UNIX) |