Этот пример показывает вам как:
Сгенерируйте повторно используемый код из кода MATLAB®, который не использует персистентные или глобальные данные.
Автоматически сгенерируйте код С из своего кода MATLAB.
Задайте свойства входного параметра функции в командной строке.
Задайте свойства генерации кода.
Сгенерируйте генерацию кода, сообщают, что можно использовать для представления и отладить код MATLAB.
Этот пример работает на Windows® только.
Чтобы завершить этот пример, установите следующие продукты:
MATLAB
MATLAB Coder™
Компилятор C
MATLAB Coder определяет местоположение и использует поддерживаемый установленный компилятор. Для текущего списка поддерживаемых компиляторов см. Поддерживаемые и Совместимые Компиляторы на веб-сайте MathWorks®.
Можно использовать mex -setup
изменить компилятор по умолчанию. См. Компилятор Значения по умолчанию Изменения (MATLAB).
Ввод | Имя | Описание |
---|---|---|
Функциональный код | 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
полный путь папки работы, содержащей ваши файлы.
Этот пример требует библиотек, которые характерны для операционной системы Windows Microsoft® и, поэтому, запуски только на платформах 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 Only) |
Вызовите повторно используемый код с персистентными данными по UNIX | Вызовите повторно используемый код — многопоточный с персистентными данными (только UNIX) |