В этом учебном пособии показано, как:
Создайте код повторного ввода из кода MATLAB ®, который не использует постоянные или глобальные данные.
Автоматическое создание кода C из кода MATLAB.
Определите свойства ввода функции в командной строке.
Укажите свойства создания кода.
Создайте отчет о создании кода, который можно использовать для просмотра и отладки кода MATLAB.
Примечание
Этот пример выполняется только в Windows ®.
Чтобы завершить этот пример, установите следующие продукты:
MATLAB
MATLAB Coder™
Компилятор C
Кодер MATLAB находит и использует поддерживаемый установленный компилятор. Текущий список поддерживаемых компиляторов см. в разделе Поддерживаемые и совместимые компиляторы на веб-сайте 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. Это простой многопоточный пример, в котором не используются постоянные или глобальные данные. Два потока вызывают функцию MATLABmatrix_exp с различными наборами входных данных.
При создании повторно используемого кода повторного ввода кодер MATLAB поддерживает динамическое распределение:
Переменные функции, которые слишком велики для стека
Постоянные переменные
Глобальные переменные
Кодер MATLAB генерирует файл заголовка, 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 для создания кода 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 предоставляет ссылку на отчет.
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) |