Сгенерируйте код для глобальных данных

Рабочий процесс

Чтобы сгенерировать код C/C + + из MATLAB® код, который использует глобальные данные:

  1. Объявите переменные глобальными в коде.

  2. Перед использованием глобальных данных определите и инициализируйте их.

    Для получения дополнительной информации см. раздел «Определение глобальных данных».

  3. Сгенерируйте код с помощью приложения 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 генерирует ошибку.

Определение глобальных данных в глобальной рабочей области MATLAB

Чтобы сгенерировать MEX-функцию для use_globals функция, описанная в Объявить глобальные переменные, используя codegen:

  1. В рабочем пространстве MATLAB задайте и инициализируйте глобальные данные. В подсказке MATLAB введите:

    global AR B;
    AR = ones(4);
    B = [1 2 3];
    

  2. Сгенерируйте файл 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

Определение глобальных данных с помощью приложения MATLAB Coder

  1. На странице Define Input Types автоматически задайте типы входа или нажатия кнопки Let me enter input or global types directly.

    Приложение отображает таблицу входов точки входа.

  2. Чтобы добавить глобальную переменную, нажмите Add global.

    По умолчанию приложение называет первую глобальную переменную в проекте gи последующие глобальные переменные g1, g2и так далее.

  3. В разделе Global variables введите имя глобальной переменной.

  4. Щелкните поле справа от имени глобальных переменных. Задайте тип и начальное значение глобальной переменной. Смотрите Задать Тип Глобальной Переменной и Начальное Значение Используя Приложение.

    Если тип не задан, необходимо создать переменную с таким же именем в глобальной рабочей области.

Определение глобальных данных в командной строке

Чтобы задать глобальные данные в командной строке, используйте 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.

Синхронизация глобальных данных с MATLAB

Зачем синхронизировать глобальные данные?

Сгенерированные 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 (по умолчанию)

Да. Используйте coder.extrinsic -sync:off опция отключения синхронизации для внешних вызовов, которые не изменяют глобальные данные.

Имеют максимальную согласованность, когда большинство внешних вызовов не изменяют глобальные данные, но некоторые делают.At MEX-function entry and exit

Да. Используйте coder.extrinsic -sync:on опция синхронизации только вызовов, которые изменяют глобальные данные.

Максимизируйте эффективность при синхронизации глобальных данных, и ни один из ваших внешних вызовов не изменяет глобальные данные.At MEX-function entry and exitНет.
Обмен данными только между сгенерированными MEX-функциями. Нет взаимодействия между MATLAB и MEX-функцией глобальными данными.DisabledНет.

Как синхронизировать глобальные данные

Чтобы управлять глобальными данными синхронизацией, установите глобальные данные режим синхронизации и выберите, синхронизировать ли внешние функции. Инструкции по использованию опций см. в разделе «Когда синхронизировать глобальные данные».

Управлять режимом синхронизации глобальных данных можно из диалогового окна параметров проекта, командной строки или диалогового окна строения MEX. Вы управляете синхронизацией данных с внешними функциями, используя coder.extrinsic -sync:on и -sync:off опции.

Управление режимом синхронизации Глобальных данных с помощью приложения MATLAB Coder

  1. Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.

  2. Установите Build type значение MEX.

  3. Нажмите More Settings.

  4. На вкладке Memory установите Global data synchronization mode равным At MEX-function entry and exit или Disabled, в зависимости от обстоятельств.

Управление режимом Глобальных данных синхронизации из командной строки

  1. В рабочем пространстве MATLAB задайте объект строения генерации кода. В командной строке MATLAB введите:

    mexcfg = coder.config('mex');

  2. В командной строке MATLAB установите GlobalDataSyncMethod свойство к SyncAtEntryAndExits или NoSync, в зависимости от обстоятельств. Для примера:

    mexcfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
    

  3. При компиляции кода используйте 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 команда также удаляет обе копии.

Задайте постоянные глобальные данные

Если вы знаете, что значение глобальной переменной не меняется во время исполнения, можно уменьшить накладные расходы в сгенерированном коде, указав, что глобальная переменная имеет постоянное значение. Вы не можете записать в постоянную глобальную переменную.

Определите постоянные глобальные данные с помощью приложения MATLAB Coder

  • На странице Define Input Types автоматически задайте типы входа или нажатия кнопки Let me enter input or global types directly.

    Приложение отображает таблицу входов точки входа.

  1. Чтобы добавить глобальную переменную, нажмите Add global.

    По умолчанию приложение называет первую глобальную переменную в проекте gи последующие глобальные переменные g1, g2и так далее.

  2. В разделе Global Variables введите имя глобальной переменной.

  3. Щелкните поле справа от имени глобальной переменной.

  4. Выберите Define Constant Value.

  5. В поле справа от глобальной переменной введите выражение MATLAB.

Задайте постоянные глобальные данные в командной строке

Чтобы указать, что глобальная переменная является постоянной, используйте codegen команда, используйте -globals опция со coder.Constant класс.

  1. Задайте объект строения для требуемого типа выхода генерации кода. Для примера задайте объект строения для генерации кода MEX:

    cfg = coder.config('mex');
    

  2. Использовать coder.Constant чтобы указать, что глобальная переменная имеет постоянное значение. Например, следующий код определяет, что глобальная переменная g имеет начальное значение 4 и эта глобальная переменная gc имеет постоянное значение 42.

    global_values = {'g', 4, 'gc', coder.Constant(42)};
  3. Сгенерируйте код с помощью -globals опция. Для примера сгенерируйте код для myfunction указывает, что глобальные переменные определены в массиве ячеек global_values.

    codegen -config cfg -globals global_values myfunction

Согласованность между MATLAB и постоянными глобальными данными

По умолчанию сгенерированная MEX-функция проверяет, что значения постоянных глобальных данных в рабочем пространстве MATLAB соответствуют значениям времени компиляции в сгенерированном MEX. Он проверяет согласованность при входе в функцию и после вызовов внешних функций. Если MEX-функция обнаруживает несогласованность, она заканчивается ошибкой. Чтобы управлять, когда MEX-функция проверяет на согласованность, используйте глобальный режим синхронизации и coder.extrinsic опции синхронизации.

В следующей таблице показов, как глобальные данные режим синхронизации и coder.extrinsic установка опции синхронизации определяет, когда MEX-функция проверяет согласованность между значениями глобальных данных константы компиляции и MATLAB.

Глобальные данные (проект)GlobalDataSyncMethod (объект строения MEX)Проверьте непротиворечивость постоянных глобальных значений при вводе MEX-функцииcoder.extrinsic опция синхронизацииПроверьте непротиворечивость постоянных глобальных значений после вызова внешней функции

At MEX-function entry, exit and extrinsic calls (по умолчанию)

'SyncAlways'

да

'sync:on' (по умолчанию)

да

'sync:off'

нет

At MEX-function entry and exit

'SyncAtEntryAndExits'

да

'sync:on'

да

'sync:off' (по умолчанию)

нет

Disabled

'NoSync'

нет

Н/Д

Н/Д

Постоянные глобальные данные в отчете генерации кода

Отчет генерации кода предоставляет следующую информацию о постоянной глобальной переменной:

  • Тип Global на вкладке Variables.

  • Имя подсвеченной переменной на панели Function.

См. «Просмотр переменного MATLAB».

Глобальные данные для сгенерированного кода

  • Переменные глобальной структуры не могут содержать указателя объектов или разреженных массивов.

  • Вы не можете применить coder.cstructname непосредственно к глобальной переменной. Чтобы назвать тип структуры, используемый с глобальной переменной, используйте coder.cstructname для создания объекта-типа с именем типа структуры. Затем, когда вы бегаете codegen, укажите, что глобальная переменная имеет этот тип. См. раздел «Назовите тип структуры C, используемый с глобальной структурной переменной».

См. также

Похожие темы