Сгенерируйте код С из кода, содержащего глобальные данные

Обзор рабочего процесса

Чтобы сгенерировать MEX-функции из MATLAB® код, который использует глобальные данные:

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

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

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

  3. Скомпилируйте код используя fiaccel.

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

Объявление глобальных переменных

Для генерации кода необходимо объявить глобальные переменные, прежде чем использовать их в коде MATLAB. Рассмотрим use_globals функция, которая использует две глобальные переменные AR и B.

function y = use_globals()
%#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) = B(1);
y = AR * 2;

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

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

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

Чтобы скомпилировать use_globals функция, описанная в Объявлении глобальных переменных с помощью fiaccel:

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

    global AR B;
    AR = fi(ones(4),1,16,14);
    B = fi([1 2 3],1,16,13);
    

  2. Скомпилируйте функцию, чтобы сгенерировать Файл MEX с именем use_globalsx.

    fiaccel -o use_globalsx use_globals

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

Чтобы задать глобальные данные в командной строке, используйте fiaccel -global опция. Для примера, чтобы скомпилировать use_globals функция, описанная в Объявлении глобальных переменных, задает два глобальных входов AR и B в командной строке.

fiaccel -o use_globalsx ...
   -global {'AR',fi(ones(4)),'B',fi([1 2 3])} use_globals

Кроме того, задайте тип и начальное значение с -globals флаг, использующий формат -globals {'g', {type, initial_value}}.

Определение глобальных данных переменного размера.  Чтобы предоставить начальные значения для глобальных данных переменного размера, задайте тип и начальное значение с -globals флаг, использующий формат -globals {'g', {type, initial_value}}. Например, чтобы задать глобальную переменную g1 которое имеет начальное значение [1 1] и верхняя граница [2 2], введите:

fiaccel foo -globals {'g1',{coder.typeof(0,[2 2],1),[1 1]}}
Для подробного объяснения coder.typeof синтаксис, см. coder.typeof (MATLAB Coder).

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

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

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

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

По умолчанию синхронизация между глобальными данными в код MATLAB и сгенерированным кодом происходит при входе и выходе MEX-функции и для всех extrinsic вызовов, которые являются вызовами функций MATLAB на пути MATLAB, который fiaccel отправляет в MATLAB для выполнения. Это поведение гарантирует максимальную согласованность между сгенерированным кодом и 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Нет.
Общайтесь только между файлами сгенерированного кода. Никакого взаимодействия между глобальными данными в код MATLAB и сгенерированным кодом.DisabledНет.

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

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

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

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

  1. Задайте объект опций компилятора в рабочем пространстве MATLAB путем выдачи команды конструктора:

    comp_cfg = coder.mexconfig

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

    comp_cfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
    

  3. Используйте comp_cfg объект строения при компиляции кода путем определения его с помощью -config опция компиляции. Для примера,

    fiaccel -config comp_cfg myFile

Управление синхронизацией для внешних вызовов функций.  Можно контролировать, происходит ли синхронизация между глобальными данными в код MATLAB и сгенерированным кодом до и после вызова внешней функции. Для этого используйте 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. Когда синхронизация отключена, вы не можете управлять синхронизацией для определенных внешних вызовов. The -sync:on опция не влияет.

Очистка глобальных данных

Поскольку MEX-функции и MATLAB имеют свои собственные копии глобальных данных, вы должны clear обе копии для обеспечения того, чтобы последовательные запуски MEX давали одинаковые результаты. The clear global команда удаляет только копию глобальных данных в рабочем пространстве MATLAB. Чтобы удалить обе копии данных, используйте clear global и clear mex команды вместе. The clear all команда также удаляет обе копии.

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

Вы не можете использовать глобальные данные с coder.varsize функция. Вместо этого используйте coder.typeof объект для определения глобальных данных переменного размера, как описано в разделе «Определение глобальных данных переменного размера».

Похожие темы