exponenta event banner

Создание кода для глобальных данных

Технологический процесс

Для создания кода 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 генерирует ошибку.

Определение глобальных данных в глобальной рабочей области 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

  1. На странице Определение типов ввода (Define Input Types) автоматически определите типы ввода или нажмите кнопку Разрешить ввод типов ввода или глобальных типов непосредственно.

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

  2. Чтобы добавить глобальную переменную, щелкните Добавить глобальную.

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

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

  4. Щелкните поле справа от имени глобальных переменных. Укажите тип и начальное значение глобальной переменной. См. раздел Определение типа глобальной переменной и начального значения с помощью приложения.

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

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

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

Синхронизация глобальных данных с 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

  1. Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

  2. Задать для типа построения значение MEX.

  3. Щелкните Дополнительные параметры.

  4. На вкладке «Память» установите режим глобальной синхронизации данных в значение 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. clear global удаляет только копию глобальных данных в рабочей области MATLAB. Чтобы удалить обе копии данных, используйте clear global и clear mex команды вместе. clear all команда также удаляет обе копии.

Определение постоянных глобальных данных

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

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

  • На странице Определение типов ввода (Define Input Types) автоматически определите типы ввода или нажмите кнопку Разрешить ввод типов ввода или глобальных типов непосредственно.

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

  1. Чтобы добавить глобальную переменную, щелкните Добавить глобальную.

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

  2. В разделе «Глобальные переменные» введите имя глобальной переменной.

  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.

Режим глобальной синхронизации данных (проект)(объект конфигурации 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 на вкладке Переменные.

  • Имя выделенной переменной на панели «Функция».

См. раздел Просмотр переменных MATLAB.

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

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

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

См. также

Связанные темы