Для создания кода 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 генерирует ошибку.
Создание функции 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) автоматически определите типы ввода или нажмите кнопку Разрешить ввод типов ввода или глобальных типов непосредственно.
Приложение отображает таблицу входных точек входа.
Чтобы добавить глобальную переменную, щелкните Добавить глобальную.
По умолчанию приложение называет первую глобальную переменную в проекте gи последующие глобальные переменные g1, g2и так далее.
В разделе Глобальные переменные введите имя глобальной переменной.
Щелкните поле справа от имени глобальных переменных. Укажите тип и начальное значение глобальной переменной. См. раздел Определение типа глобальной переменной и начального значения с помощью приложения.
Если тип не указан, необходимо создать переменную с тем же именем в глобальной рабочей области.
Для определения глобальных данных в командной строке используйте codegen
-globals вариант. Например, для компиляции use_globals функция, описанная в объявлении глобальных переменных, укажите два глобальных входа AR и B в командной строке. Используйте -args чтобы указать, что входные данные u - вещественный скалярный двойник. По умолчанию кодеген генерирует функцию 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
Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».![]()
Задать для типа построения значение MEX.
Щелкните Дополнительные параметры.
На вкладке «Память» установите режим глобальной синхронизации данных в значение 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) автоматически определите типы ввода или нажмите кнопку Разрешить ввод типов ввода или глобальных типов непосредственно.
Приложение отображает таблицу входных точек входа.
Чтобы добавить глобальную переменную, щелкните Добавить глобальную.
По умолчанию приложение называет первую глобальную переменную в проекте 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 согласуются со значениями времени компиляции в созданной MEX. Он проверяет непротиворечивость при вводе функции и после вызовов внешних функций. Если функция MEX обнаруживает несогласованность, она завершается ошибкой. Для управления проверкой непротиворечивости функции MEX используйте режим глобальной синхронизации и coder.extrinsic параметры синхронизации.
В следующей таблице показано, как работает режим глобальной синхронизации данных и coder.extrinsic параметр синхронизации определяет, когда функция MEX проверяет согласованность между значениями глобальных данных постоянной времени компиляции и MATLAB.
| Режим глобальной синхронизации данных (проект) | (объект конфигурации MEX) | Проверка непротиворечивости постоянных глобальных значений при вводе функции MEX | параметр синхронизации coder.extrinsic | Проверка непротиворечивости постоянных глобальных значений после вызова внешней функции |
|---|---|---|---|---|
|
| да |
| да |
| нет | |||
|
| да |
| да |
| нет | |||
|
| нет | Н/Д | Н/Д |
Отчет о создании кода предоставляет следующую информацию о постоянной глобальной переменной:
Тип Global на вкладке Переменные.
Имя выделенной переменной на панели «Функция».
См. раздел Просмотр переменных MATLAB.
Переменные глобальной структуры не могут содержать объекты-дескрипторы или разреженные массивы.
Вы не можете применить coder.cstructname непосредственно к глобальной переменной. Для присвоения имени типу структуры, используемому с глобальной переменной, используйте coder.cstructname для создания объекта типа с именем типа структуры. Затем, когда вы бежите codegenукажите, что глобальная переменная имеет этот тип. См. раздел Наименование типа структуры C для использования с переменной глобальной структуры.