При обработке вызова функции foo
в вашем MATLAB® code, генератор кода находит определение foo
и генерирует код для своего тела. В некоторых случаях можно обойти генерацию кода и вместо этого использовать движок MATLAB для выполнения вызова. Использование coder.extrinsic('foo')
чтобы объявить, что вызовы foo
не генерируйте код и вместо этого используйте движок MATLAB для выполнения. В этом контексте foo
упоминается как внешняя функция. Эта функциональность доступна только, когда движок MATLAB доступен во время выполнения. Примеры таких ситуаций включают выполнение MEX-функций, Simulink® симуляции или вызовы функций во время генерации кода (также известное как compile time).
Если вы генерируете автономный код для функции, которая вызывает foo
и включает в себя coder.extrinsic('foo')
генератор кода пытается определить, foo
ли влияет на выход. Если
foo
не влияет на выход, генератор кода продолжает генерацию кода, но исключает foo
из сгенерированного кода. В противном случае генератор кода производит ошибку компиляции.
Включая coder.extrinsic('foo')
директива внутри определенной функции MATLAB объявляет все вызовы foo
внутри этого функция MATLAB как внешняя. Кроме того, можно хотеть сузить возможности внешнего объявления всего одним вызовом к foo
. См. «Вызов функций MATLAB с использованием feval».
Это некоторые распространенные ситуации, в которых вы можете рассмотреть возможность объявления функции MATLAB внешней:
Функция выполняет действия отображения или регистрации. Такие функции применяются в основном во время симуляции и не используются во встраиваемых системах.
В выполнении MEX или симуляции Simulink необходимо использовать функцию MATLAB, которая не поддерживается для генерации кода. Этот рабочий процесс не применяется к объектам, не являющимся объектами несимуляции.
Вы предписываете генератору кода постоянно складывать вызов функции при помощи coder.const
. В таких ситуациях функция вызывается только во время генерации кода, когда движок MATLAB доступен для выполнения вызова.
coder.extrinsic
КонструкцияОбъявление функции foo
как extinsic, включите этот оператора в код MATLAB.
coder.extrinsic('foo')
При объявлении функций как внешних для генерации кода придерживайтесь следующих правил:
Объявите функцию как внешнюю перед вызовом.
Не используйте внешнее объявление в условных операторах.
Присвойте возврат значение внешней функции известному типу. См. «Работа с mxArrays».
Для получения дополнительной информации и примеров смотрите coder.extrinsic
.
Генератор кода автоматически обрабатывает многие общие функции визуализации MATLAB, такие как plot
, disp
, и figure
, как внешняя. Вы не должны явно объявить их как внешние функции при помощи coder.extrinsic
. Для примера можно хотеть позвонить plot
визуализация результатов в среде MATLAB. Если вы генерируете MEX-функцию из функции, которая вызывает plot
, а затем запустите сгенерированную MEX-функцию, генератор кода отправляет вызовы на plot
функцию для движка MATLAB. Если вы генерируете библиотеку или исполняемый файл, сгенерированный код не содержит вызовов plot
функция.
Если при помощи MATLAB Coder™ вы генерируете MEX или автономный код C/C + +, в отчете о генерации кода подсвечиваются вызовы из кода MATLAB во внешние функции. При проверке отчета можно определить, какие функции поддерживаются только в среде MATLAB.
The coder.extrinsic
конструкция имеет возможности функций. Например, рассмотрим следующий код:
function y = foo %#codegen coder.extrinsic('rat','min'); [N D] = rat(pi); y = 0; y = min(N, D);
В этом примере, rat
и min
обрабатывается как внешняя каждый раз, когда они вызываются в основной функции foo
. Существует два способа сузить возможности внешнего объявления внутри основной функции:
Объявите функцию MATLAB внешней в локальной функции, как в этом примере:
function y = foo %#codegen coder.extrinsic('rat'); [N D] = rat(pi); y = 0; y = mymin(N, D); function y = mymin(a,b) coder.extrinsic('min'); y = min(a,b);
Здесь, функция rat
является внешним каждый раз, когда он вызывается внутри основной функции foo
, но функция min
является внешним только при вызове внутри локальной функции mymin
.
Вместо использования coder.extrinsic
создайте, вызовите функцию MATLAB, используя feval
. Этот подход описан в следующем разделе.
Предположим, что вы задаете класс myClass
который имеет нестатический метод foo
, а затем создайте образец obj
этого класса. Если вы хотите объявить метод obj.foo
Будучи внешним в коде MATLAB, который вы планируете для генерации кода, следуйте следующим правилам:
Напишите вызов в foo
как вызов функции. Не записывайте вызов с помощью записи через точку.
Объявить foo
быть внешним при помощи синтаксиса coder.extrinsic('foo')
.
Для примера задайте myClass
как:
classdef myClass properties prop = 1 end methods function y = foo(obj,x) y = obj.prop + x; end end end
Вот пример функции MATLAB, которая объявляет foo
как extinsic.
function y = myFunction(x) %#codegen coder.extrinsic('foo'); obj = myClass; y = foo(obj,x); end
Нестатические методы также известны как обычные методы. См. «Определение методов и функций классов».
Используйте coder.extrinsic
создать к:
Вызовите функции MATLAB, которые не выдают выход во время симуляции, не генерируя ненужный код.
Сделайте свой код самодокументирующимся и легче отлаживаемым. Можно сканировать исходный код на coder.extrinsic
операторы для изоляции вызовов функций MATLAB, которые потенциально могут создавать и распространять mxArrays
. См. «Работа с mxArrays».
feval
Чтобы сузить возможности внешнего объявления всего до одного вызова функции, используйте функцию feval
. feval
автоматически интерпретируется как внешняя функция во время генерации кода. Поэтому можно использовать feval
для удобства вызова функций, которые вы хотите выполнить в среде MATLAB, а не компиляции в сгенерированный код.
Рассмотрим следующий пример:
function y = foo coder.extrinsic('rat'); [N D] = rat(pi); y = 0; y = feval('min',N,D);
Поскольку feval
является внешним, оператор feval('min',N,D)
оценивается MATLAB - не скомпилирован - который имеет тот же результат, что и объявление функции min
extinsic только для этого одного вызова. Напротив, функция rat
является внешним по всей функции foo
.
Генератор кода не поддерживает использование feval
вызов локальных функций или функций, расположенных в частной папке.
Выход внешней функции является mxArray
, также известный как массив MATLAB. Единственные допустимые операции для mxArrays
являются:
Хранение mxArray
в переменной.
Передача mxArray
в функцию.
Возврат mxArray
из функции обратно в MATLAB.
Преобразование mxArray
к известному типу во время выполнения. Чтобы выполнить это действие, присвойте mxArray
переменной, тип которой уже определен предшествующим назначением. См. пример ниже.
Как использовать mxArray
возвращенная внешней функцией в других операциях (для примера, возвращая ее из блока MATLAB Function в выполнение Simulink), необходимо сначала преобразовать ее в известный тип.
Если входные параметры функции mxArrays
генератор кода автоматически обрабатывает функцию как внешнюю.
Преобразование mxArray
известному типу присвойте mxArray
переменной, тип которой задан. Во время исполнения mxArray
преобразуется в тип переменной, которой она назначена. Однако, если данные в mxArray
не соответствует типу переменной, вы получаете ошибку времени выполнения.
Для примера рассмотрим этот код:
function y = foo %#codegen coder.extrinsic('rat'); [N D] = rat(pi); y = min(N,D);
Здесь функция верхнего уровня foo
вызывает внешнюю функцию MATLAB rat
, который возвращает два mxArrays
представляющий числитель N
и знаменатель D
рационального дробного приближения pi
. Вы можете пройти эти mxArrays
другой функции MATLAB - в данном случае min
. Потому что входы перешли к min
являются mxArrays
Генератор кода автоматически обрабатывает min
как внешнюю функцию. В результате min
возвращает mxArray
.
При генерации MEX-функции с помощью MATLAB Coder можно непосредственно назначить эту mxArray
возвращается по min
в выход y
потому что MEX-функция возвращает свой выход в MATLAB.
Но если положить foo
в блоке MATLAB Function в модели Simulink и затем обновляйте или запускаете модель, вы получаете эту ошибку:
Function output 'y' cannot be an mxArray in this context. Consider preinitializing the output variable with a known type.
Эта ошибка возникает из-за возврата mxArray
возврат к Simulink не поддерживается. Чтобы решить эту проблему, задайте y
быть типом и размером ожидаемого значения min
для возврата - в этом случае скаляр двойника - следующим образом:
function y = foo %#codegen coder.extrinsic('rat'); [N D] = rat(pi); y = 0; % Define y as a scalar of type double y = min(N,D);
Полное окружение выполнения MATLAB не поддерживается во время генерации кода. Поэтому при внешнем вызове функций MATLAB применяются следующие ограничения:
Функции MATLAB, которые проверяют вызывающего абонента, или считывают или записывают в рабочую область вызывающего абонента, не работают во время генерации кода. Такие функции включают:
Функции в сгенерированном коде могут привести к непредсказуемым результатам, если ваша внешняя функция выполняет следующие действия во время исполнения:
Изменение папок
Измените путь MATLAB
Удалите или добавьте файлы MATLAB
Изменение предупреждающих состояний
Изменение настроек MATLAB
Изменение параметров Simulink
Генератор кода не поддерживает использование coder.extrinsic
вызывать функции, расположенные в частной папке.
Генератор кода не поддерживает использование coder.extrinsic
вызов локальных функций.
Можно вызвать внешние функции с до 64 входами и 64 выходами.