Чтобы сгенерировать код 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 автоматически задайте типы входа или нажатия кнопки Let me enter input or global types directly.
Приложение отображает таблицу входов точки входа.
Чтобы добавить глобальную переменную, нажмите Add global.
По умолчанию приложение называет первую глобальную переменную в проекте g
и последующие глобальные переменные g1
, g2
и так далее.
В разделе Global variables введите имя глобальной переменной.
Щелкните поле справа от имени глобальных переменных. Задайте тип и начальное значение глобальной переменной. Смотрите Задать Тип Глобальной Переменной и Начальное Значение Используя Приложение.
Если тип не задан, необходимо создать переменную с таким же именем в глобальной рабочей области.
Чтобы задать глобальные данные в командной строке, используйте codegen
-globals
опция. Для примера, чтобы скомпилировать use_globals
функция, описанная в Declare Global Variables, задает два глобальных входов 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 давали одинаковые результаты. The clear global
команда удаляет только копию глобальных данных в рабочем пространстве MATLAB. Чтобы удалить обе копии данных, используйте clear global
и clear mex
команды вместе. The clear all
команда также удаляет обе копии.
Если вы знаете, что значение глобальной переменной не меняется во время исполнения, можно уменьшить накладные расходы в сгенерированном коде, указав, что глобальная переменная имеет постоянное значение. Вы не можете записать в постоянную глобальную переменную.
На странице Define Input Types автоматически задайте типы входа или нажатия кнопки 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, используемый с глобальной структурной переменной».