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

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

Чтобы сгенерировать 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

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

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

Почему синхронизируют глобальные данные?

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

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

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

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

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

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

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

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

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

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

Похожие темы