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

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

Чтобы сгенерировать код 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, автоматически входные define типы или нажимают Let me enter input or global types directly.

    Отображения приложения таблица входных параметров точки входа.

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

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

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

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

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

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

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

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

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

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

Задайте постоянные глобальные данные Используя приложение MATLAB Coder

  • На странице Define Input Types, автоматически входные define типы или нажимают 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, чтобы Использовать С Глобальной Переменной Структуры.

Смотрите также

Похожие темы