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

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

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

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

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

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

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

Похожие темы