Этот пример показывает вам как:
Сгенерируйте повторно используемый код из кода 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_nameStackData
Содержит выделенную память пользователя. Передайте указатель на эту структуру как первый параметр к функциям, которые используют его:
Непосредственно (функция использует поле в структуре),
Косвенно (функция передает структуру вызванной функции),
Если алгоритм использует персистентные или глобальные данные, primary_function_nameStackData структура также содержит указатель на primary_function_namePersistentData структура. Если вы включаете этот указатель, необходимо передать только один параметр каждой вызывающей функции.
primary_function_namePersistentData
Если ваш алгоритм использует персистентные или глобальные переменные, 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) |