Чтобы сгенерировать код 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 задайте и инициализируйте глобальные данные. В подсказке 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, автоматически входные define типы или нажимают Let me enter input or global types directly.
Отображения приложения таблица входных параметров точки входа.
Чтобы добавить глобальную переменную, нажмите Add global.
По умолчанию приложение называет первую глобальную переменную в проекте g
, и последующие глобальные переменные g1
, g2
, и так далее.
Под Global variables введите имя для глобальной переменной.
Кликните по полю справа от имени глобальных переменных. Задайте тип и начальное значение глобальной переменной. Смотрите Задают Тип Глобальной переменной и Начальное значение Используя Приложение.
Если вы не задаете тип, необходимо создать переменную с тем же именем в глобальной рабочей области.
Чтобы задать глобальные данные в командной строке, используйте codegen
-globals
опция. Например, чтобы скомпилировать 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. Вы управляете синхронизацией данных с внешними функциями с помощью coder.extrinsic
-sync:on
и -sync:off
опции.
Управление режимом синхронизации глобальных данных Используя приложение MATLAB Coder
Чтобы открыть диалоговое окно Generate, на странице Generate Code, кликают по стреле Generate.
Установите Build type на MEX
.
Нажмите More Settings.
На вкладке Memory, набор Global data synchronization mode к At MEX-function entry and exit
или Disabled
, как применимый.
Управление режимом синхронизации глобальных данных из командной строки
В рабочем пространстве MATLAB задайте объект настройки генерации кода. В командной строке MATLAB, введите:
mexcfg = coder.config('mex');
В командной строке MATLAB, набор GlobalDataSyncMethod
свойство к SyncAtEntryAndExits
или NoSync
, как применимый. Например:
mexcfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
При компиляции кода используйте mexcfg
объект настройки. Например, чтобы сгенерировать MEX-функцию для функционального foo
это не имеет никаких входных параметров:
codegen -config mexcfg foo
Управление Синхронизацией для Внешних Вызовов функции. Чтобы управлять, происходит ли синхронизация между MATLAB и глобальными данными MEX-функции до и после вас, вызывают внешнюю функцию, используют coder.extrinsic
-sync:on
и -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. Чтобы удалить обе копии данных, используйте clear global
и clear mex
команды вместе. clear all
команда также удаляет обе копии.
Если вы знаете, что значение глобальной переменной не изменяется во время выполнения, можно уменьшать наверху в сгенерированном коде путем указывания, что глобальная переменная имеет постоянное значение. Вы не можете записать в постоянную глобальную переменную.
На странице Define Input Types, автоматически входные define типы или нажимают Let me enter input or global types directly.
Отображения приложения таблица входных параметров точки входа.
Чтобы добавить глобальную переменную, нажмите Add global.
По умолчанию приложение называет первую глобальную переменную в проекте g
, и последующие глобальные переменные g1
, g2
, и так далее.
Под Global Variables введите имя для глобальной переменной.
Кликните по полю справа от имени глобальной переменной.
Выберите 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 сопоставимы со значениями времени компиляции в сгенерированном MEX. Это тестирует на непротиворечивость при функциональной записи и после вызовов внешних функций. Если MEX-функция обнаруживает несоответствие, она заканчивается ошибкой. Чтобы управлять когда тесты MEX-функции для непротиворечивости, используйте глобальный режим синхронизации и coder.extrinsic
опции синхронизации.
Следующая таблица показывает как режим синхронизации глобальных данных и coder.extrinsic
установка опции синхронизации определяет, когда MEX-функция проверяет непротиворечивость между временем компиляции постоянные значения глобальных данных и MATLAB.
Режим синхронизации глобальных данных (проект) | GlobalDataSyncMethod (объект настройки MEX) | Проверьте непротиворечивость постоянных глобальных значений при записи MEX-функции | опция синхронизации coder.extrinsic | Проверьте непротиворечивость постоянных глобальных значений после внешнего вызова функции |
---|---|---|---|---|
|
| да |
| да |
| нет | |||
|
| да |
| да |
| нет | |||
|
| нет | Нет данных | Нет данных |
Отчет генерации кода предоставляет следующую информацию о постоянной глобальной переменной:
Тип Global
на вкладке Variables.
Подсвеченное имя переменной в панели Function.
Смотрите переменные MATLAB.
Глобальные переменные структуры не могут содержать объекты указателя или разреженные массивы.
Вы не можете применяться coder.cstructname
непосредственно к глобальной переменной. Чтобы назвать тип структуры, чтобы использовать с глобальной переменной, использовать coder.cstructname
создать текстовый объект, который называет тип структуры. Затем когда вы запускаетесь codegen
, укажите, что глобальная переменная имеет тот тип. Смотрите Имя Тип Структуры C, чтобы Использовать С Глобальной Переменной Структуры.