Чтобы сгенерировать MEX-функции из кода MATLAB®, который использует глобальные данные:
Объявите переменные как глобальную переменную в вашем коде.
Задайте и инициализируйте глобальные данные перед использованием его.
Для получения дополнительной информации смотрите Глобальные данные Определения.
Скомпилируйте свое использование кода 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
генерирует ошибку.
Скомпилировать use_globals
функция описана в Объявлении использования Глобальных переменных fiaccel
:
Задайте глобальные данные в рабочем пространстве MATLAB. В подсказке MATLAB, введите:
global AR B;
AR = fi(ones(4),1,16,14);
B = fi([1 2 3],1,16,13);
Скомпилируйте функцию, чтобы сгенерировать файл 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 и сгенерированным кодом происходит при входе и выходе MEX-функции и для всех вызовов extrinsic, которые являются вызовами функций MATLAB на пути MATLAB это fiaccel
отправки к MATLAB для выполнения. Это поведение гарантирует максимальную непротиворечивость между сгенерированным кодом и MATLAB.
Чтобы улучшать производительность, вы можете:
Выберите, чтобы синхронизироваться только в точках входа и выхода MEX-функции.
Отключите синхронизацию, когда глобальные данные не будут взаимодействовать.
Выберите, синхронизироваться ли до и после каждого внешнего вызова.
Следующая таблица подводит итог который опции синхронизации глобальных данных использовать. Чтобы изучить, как установить эти опции, смотрите, Как Синхронизировать Глобальные данные.
Опции синхронизации глобальных данных
Если вы хотите... | Установите режим синхронизации глобальных данных на: | Синхронизироваться до и после внешних вызовов? |
---|---|---|
Обеспечьте максимальную непротиворечивость, когда все внешние вызовы изменят глобальные данные. | At MEX-function entry, exit and extrinsic calls (значение по умолчанию) | Да. Поведение по умолчанию. |
Обеспечьте максимальную непротиворечивость, когда большинство внешних вызовов изменяет глобальные данные, но некоторые не делают. | At MEX-function entry, exit and extrinsic calls (значение по умолчанию) | Да. Используйте |
Обеспечьте максимальную непротиворечивость, когда большинство внешних вызовов не изменяет глобальные данные, но некоторые делают. | At MEX-function entry and exit | Да. Используйте |
Максимизируйте эффективность при синхронизации глобальных данных, и ни один из внешних вызовов не изменяет глобальные данные. | At MEX-function entry and exit | Нет. |
Свяжитесь между файлами сгенерированного кода только. Никакое взаимодействие между глобальными данными в коде MATLAB и сгенерированным кодом. | Disabled | Нет. |
Чтобы управлять синхронизацией глобальных данных, установите режим синхронизации глобальных данных и выберите, синхронизировать ли внешние функции. Для инструкций, на который опции использовать, смотрите, Когда Синхронизировать Глобальные данные.
Вы управляете синхронизацией глобальных данных с внешними функциями с помощью coder.extrinsic
-sync:on
и -sync:off
опции.
Управление режимом синхронизации глобальных данных из командной строки
Задайте объект параметров компилятора в рабочем пространстве MATLAB путем выдачи команды конструктора:
comp_cfg = coder.mexconfig
Из командной строки, набор GlobalDataSyncMethod
свойство к Always
, SyncAtEntryAndExits
или NoSync
, как применимый. Например:
comp_cfg.GlobalDataSyncMethod = 'SyncAtEntryAndExits';
Используйте 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
объект задать глобальные данные переменного размера как описано в Определении Глобальных данных переменного размера.