В этом руководстве показано, как:
Сгенерируйте входящий код из 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_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) |
Вызов повторно входящего кода с постоянными данными в UNIX | Входящий код вызова - многопоточный с постоянными данными (только для UNIX) |