Чтобы сгенерировать код C/C++ из кода MATLAB®, который использует глобальные данные:
Объявите переменные как глобальную переменную в вашем коде.
Перед использованием глобальных данных задайте и инициализируйте его.
Для получения дополнительной информации смотрите, Задают Глобальные данные.
Сгенерируйте код с помощью приложения MATLAB Coder™ или с помощью codegen
.
При использовании глобальные данные, необходимо также задать, хотите ли вы синхронизировать это данные между MATLAB и сгенерированной MEX-функцией. Для получения дополнительной информации смотрите Синхронизирующиеся Глобальные данные с MATLAB.
При использовании глобальных данных необходимо сначала объявить глобальные переменные в коде MATLAB. Рассмотрите функцию use_globals
, которая использует две глобальных переменные AR
и B
:
function y = use_globals(u) %#codegen % Turn off inlining to make % generated code easier to read coder.inline('never'); % Declare AR and B as global variables global AR; global B; AR(1) = u + B(1); y = AR * 2;
Можно задать глобальные данные в глобальной рабочей области MATLAB в проекте MATLAB CODER, или в командной строке. Если вы не инициализируете глобальные данные в проекте или в командной строке, MATLAB CODER ищет переменную в глобальной рабочей области MATLAB. Если переменная не существует, MATLAB CODER генерирует ошибку.
Чтобы сгенерировать MEX-функцию для функции use_globals
, описанной в, Объявляют Глобальные переменные с помощью codegen
:
В MATLAB workspace задайте и инициализируйте глобальные данные. В посдказке MATLAB войдите:
global AR B;
AR = ones(4);
B = [1 2 3];
Сгенерируйте файл MEX.
codegen use_globals -args {0} % Use the -args option to specify that the input u % is a real, scalar, double % By default, codegen generates a MEX function, % use_globals_mex, in the current folder
На странице Define Input Types автоматически задайте входные типы или нажмите, Let меня вводят входной параметр или глобальные типы непосредственно.
Отображения приложения таблица входных параметров точки входа.
Чтобы добавить глобальную переменную, нажмите глобальную переменную Add.
По умолчанию приложение называет первую глобальную переменную в g
проекта и последующие глобальные переменные g1
, g2
, и так далее.
Под Глобальными переменными введите имя для глобальной переменной.
Кликните по полю справа от имени глобальных переменных. Задайте тип и начальное значение глобальной переменной. Смотрите Задают Тип Глобальной переменной и Начальное значение Используя Приложение.
Если вы не задаете тип, необходимо создать переменную с тем же именем в глобальной рабочей области.
Чтобы задать глобальные данные в командной строке, используйте
опцию -globals
codegen
. Например, чтобы скомпилировать функцию use_globals
, описанную в, Объявляют Глобальные переменные, указывают, что две глобальная переменная вводит AR
и B
в командной строке. Используйте опцию -args
, чтобы указать, что входной параметр u
является действительным, скалярным дважды. По умолчанию codegen генерирует MEX-функцию, use_globals_mex
, в текущей папке.
codegen -globals {'AR',ones(4),'B',[1 2 3]} use_globals -args {0}
Также задайте тип и начальное значение с флагом -globals
с помощью формата -globals {'g', {type, initial_value}}
. Для массивов ячеек необходимо использовать этот формат. Смотрите Задают Массивы Глобальной ячейки в Командной строке.
Определение Глобальных данных Переменного Размера. Чтобы обеспечить начальные значения для глобальных данных переменного размера, задайте тип и начальное значение с флагом -globals
с помощью формата -globals {'g', {type, initial_value}}
. Например, чтобы задать глобальную переменную g1
, который имеет начальное значение [1 1]
и верхняя граница [2 2]
, входит:
codegen foo -globals {'g1', {coder.typeof(0, [2 2],1),[1 1]}}
coder.typeof
.Сгенерированная MEX-функция и MATLAB у каждого есть их собственные копии глобальных данных. Чтобы сделать эти копии сопоставимыми, необходимо синхронизировать их глобальные данные каждый раз, когда эти два взаимодействуют. Если вы не синхронизируете данные, их глобальные переменные могут отличаться. Уровень взаимодействия определяет, когда синхронизировать глобальные данные. Для получения дополнительной информации смотрите, Когда Синхронизировать Глобальные данные.
Когда глобальные данные являются постоянными, вы не можете синхронизировать глобальные данные с MATLAB. По умолчанию MEX-функция тестирует на непротиворечивость между временем компиляции постоянные глобальные значения и значениями MATLAB при функциональной записи и после внешних вызовов функции. Если значения MATLAB отличаются со времени компиляции постоянные глобальные значения, концы MEX-функции с ошибкой. Для получения информации об управлении, когда тесты MEX-функции для непротиворечивости между временем компиляции постоянные глобальные значения и значениями MATLAB, смотрите Непротиворечивость Между MATLAB и Постоянными Глобальными данными.
По умолчанию синхронизация между глобальными данными MEX-функции и MATLAB происходит при входе и выходе MEX-функции и для внешних вызовов. Используйте этот метод синхронизации для максимальной непротиворечивости между MEX-функцией и MATLAB.
Чтобы улучшить производительность, вы можете:
Выберите, чтобы синхронизироваться только в точках входа и выхода MEX-функции.
Отключите синхронизацию, когда глобальные данные не будут взаимодействовать.
Выберите, синхронизироваться ли до и после каждого внешнего вызова.
Следующая таблица подводит итог который опции синхронизации глобальных данных использовать. Чтобы изучить, как установить эти опции, смотрите, Как Синхронизировать Глобальные данные.
Опции синхронизации глобальных данных
Если вы хотите | Установите режим синхронизации глобальных данных на: | Синхронизироваться до и после внешних вызовов? |
---|---|---|
Имейте максимальную непротиворечивость, когда все внешние вызовы изменят глобальные данные. | At MEX-function entry, exit and extrinsic calls (значение по умолчанию) | Да. Поведение по умолчанию. |
Имейте максимальную непротиворечивость, когда большинство внешних вызовов изменяет глобальные данные, но некоторые не делают. | At MEX-function entry, exit and extrinsic calls (значение по умолчанию) | Да. Используйте
опцию |
Имейте максимальную непротиворечивость, когда большинство внешних вызовов не изменяет глобальные данные, но некоторые делают. | At MEX-function entry and exit | Да. Используйте
опцию |
Максимизируйте производительность при синхронизации глобальных данных, и ни один из внешних вызовов не изменяет глобальные данные. | At MEX-function entry and exit | Нет. |
Свяжитесь между сгенерированными MEX-функциями только. Никакое взаимодействие между MATLAB и глобальными данными MEX-функции. | Disabled | Нет. |
Чтобы управлять синхронизацией глобальных данных, установите режим синхронизации глобальных данных и выберите, синхронизировать ли внешние функции. Для инструкций, на который опции использовать, смотрите, Когда Синхронизировать Глобальные данные.
Можно управлять режимом синхронизации глобальных данных от диалогового окна настроек проекта, командной строки или диалогового окна настройки MEX. Вы управляете синхронизацией данных с внешними функциями с помощью
-sync:on
coder.extrinsic
и опций -sync:off
.
Управление режимом синхронизации глобальных данных Используя приложение MATLAB CODER
Чтобы открыть диалоговое окно Generate, на Сгенерировать Кодовой странице, нажимают стрелку Generate.
Установите тип Сборки на MEX
.
Нажмите More Settings.
На вкладке Memory, режиме синхронизации Глобальных данных набора к At MEX-function entry and exit
или Disabled
, как применимый.
Управление режимом синхронизации глобальных данных из командной строки
В MATLAB workspace задайте объект настройки генерации кода. В командной строке MATLAB войдите:
mexcfg = coder.config('mex');
В командной строке MATLAB, набор свойство GlobalDataSyncMethod
к SyncAtEntryAndExits
или NoSync
, как применимый. Например:
mexcfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
При компиляции кода используйте объект настройки mexcfg
. Например, чтобы сгенерировать MEX-функцию для функционального foo
, который не имеет никаких входных параметров:
codegen -config mexcfg foo
Управление Синхронизацией для Внешних Вызовов функции. Чтобы управлять, происходит ли синхронизация между MATLAB и глобальными данными MEX-функции до и после вас, вызывают внешнюю функцию, используют -sync:on
coder.extrinsic
и опции -sync:off
.
По умолчанию глобальные данные:
Синхронизируемый до и после каждого внешнего вызова, если режимом синхронизации глобальных данных является At MEX-function entry, exit and extrinsic calls
. Если вы уверены, что определенные внешние вызовы не изменяют глобальные данные, выключите синхронизацию для этих вызовов с помощью опции -sync:off
. Например, если функции, foo1
и foo2
не изменяют глобальные данные, выключают синхронизацию для этих функций:
coder.extrinsic('-sync:off', 'foo1', 'foo2');
Не синхронизируемый, если режимом синхронизации глобальных данных является At MEX-function entry and exit
. Если код имеет несколько внешних вызовов, которые изменяют глобальные данные, включают синхронизацию для этих вызовов с помощью опции -sync:on
. Например, если функции foo1
и глобальные данные изменения foo2
, включите синхронизацию для этих функций:
coder.extrinsic('-sync:on', 'foo1', 'foo2');
Не синхронизируемый, если режимом синхронизации глобальных данных является Disabled
. Когда синхронизация отключена, вы не можете использовать опцию -sync:on
, чтобы управлять синхронизацией для определенных внешних вызовов.
Поскольку MEX-функции и MATLAB, у каждого есть их собственные копии глобальных данных, вы должны clear
обе копии, чтобы гарантировать, чтобы последовательные выполнения MEX привели к тем же результатам. Команда clear global
удаляет только копию глобальных данных в MATLAB workspace. Чтобы удалить обе копии данных, используйте clear global
и команды clear mex
вместе. Команда clear all
также удаляет обе копии.
Если вы знаете, что значение глобальной переменной не изменяется во время выполнения, можно уменьшить наверху в сгенерированном коде путем указывания, что глобальная переменная имеет постоянное значение. Вы не можете записать в постоянную глобальную переменную.
На странице Define Input Types автоматически задайте входные типы или нажмите, Let меня вводят входной параметр или глобальные типы непосредственно.
Отображения приложения таблица входных параметров точки входа.
Чтобы добавить глобальную переменную, нажмите глобальную переменную Add.
По умолчанию приложение называет первую глобальную переменную в g
проекта и последующие глобальные переменные g1
, g2
, и так далее.
Под Глобальными переменными введите имя для глобальной переменной.
Кликните по полю справа от имени глобальной переменной.
Выберите Define Constant Value
.
В поле справа от глобальной переменной введите выражение MATLAB.
Чтобы указать, что глобальная переменная является постоянным использованием команды codegen
, используйте опцию -globals
с классом coder.Constant
.
Задайте объект настройки для генерации кода выходной тип, который вы хотите. Например, задайте объект настройки для генерации кода MEX:
cfg = coder.config('mex');
Используйте coder.Constant
, чтобы указать, что глобальная переменная имеет постоянное значение. Например, следующий код указывает, что глобальная переменная, g
имеет начальное значение 4
и что глобальная переменная gc
имеет постоянное значение 42
.
global_values = {'g', 4, 'gc', coder.Constant(42)};
Сгенерируйте код с помощью опции -globals
. Например, сгенерируйте код для myfunction
, указывающего, что глобальные переменные заданы в массиве ячеек global_values
.
codegen -config cfg -globals global_values myfunction
По умолчанию сгенерированная MEX-функция проверяет, что значения постоянных глобальных данных в MATLAB workspace сопоставимы со значениями времени компиляции в сгенерированном MEX. Это тестирует на непротиворечивость при функциональной записи и после вызовов внешних функций. Если MEX-функция обнаруживает несоответствие, она заканчивается ошибкой. Чтобы управлять когда тесты MEX-функции для непротиворечивости, используйте глобальный режим синхронизации и опции синхронизации coder.extrinsic
.
Следующая таблица показывает, как режим синхронизации глобальных данных и установка опции синхронизации coder.extrinsic
определяют, когда MEX-функция проверяет непротиворечивость между временем компиляции постоянные значения глобальных данных и MATLAB.
Режим синхронизации глобальных данных (проект) | GlobalDataSyncMethod (объект настройки MEX) | Проверьте непротиворечивость постоянных глобальных значений при записи MEX-функции | опция синхронизации coder.extrinsic | Проверьте непротиворечивость постоянных глобальных значений после внешнего вызова функции |
---|---|---|---|---|
|
| да |
| да |
| нет | |||
|
| да |
| да |
| нет | |||
|
| нет | Нет данных | Нет данных |
Отчет генерации кода предоставляет следующую информацию о постоянной глобальной переменной:
Тип Global
на вкладке Variables.
Подсвеченное имя переменной в Функциональной панели.
Смотрите переменные MATLAB.
Глобальные переменные структуры не могут содержать объекты указателя или разреженные массивы.
Вы не можете применить coder.cstructname
непосредственно к глобальной переменной. Чтобы назвать тип структуры, чтобы использовать с глобальной переменной, используйте coder.cstructname
, чтобы создать текстовый объект, который называет тип структуры. Затем когда вы запускаете codegen
, указываете, что глобальная переменная имеет тот тип. Смотрите Имя Тип Структуры C, чтобы Использовать С Глобальной Переменной Структуры.