При обработке вызова функционального foo
в вашем коде MATLAB® генератор кода находит определение 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 Coder).
Это некоторые общие ситуации, в которых вы можете рассмотреть объявление функции MATLAB как значение внешних параметров:
Функция выполняет действия логгирования или отображение. Такие функции полезны, в основном, в процессе моделирования и не используются во встраиваемых системах.
В вашем выполнении MEX или симуляции Simulink, вы хотите использовать функцию MATLAB, которая не поддерживается для генерации кода. Этот рабочий процесс не применяется к целям несимуляции.
Вы сообщаете генератору кода к постоянному сгибу вызов функции при помощи coder.const
. В таких ситуациях функция вызвана только во время генерации кода, когда движок MATLAB доступен для выполнения вызова.
coder.extrinsic
СоздатьОбъявить функциональный foo
как значение внешних параметров, включайте этот оператор в свой код MATLAB.
coder.extrinsic('foo')
При объявлении функций как значения внешних параметров для генерации кода придерживайтесь этих правил:
Объявите функцию как значение внешних параметров, прежде чем вы вызовете его.
Не используйте внешнее объявление в условных операторах.
Присвойте возвращаемое значение внешней функции к известному типу. Смотрите Работу с mxArrays (MATLAB Coder).
Для получения дополнительной информации и примеров, смотрите coder.extrinsic
.
Генератор кода автоматически обрабатывает много общих функций визуализации MATLAB, такой как plot
, disp
, и figure
, как значение внешних параметров. Вы не должны явным образом объявлять их, когда значение внешних параметров функционирует при помощи coder.extrinsic
. Например, вы можете хотеть вызвать plot
визуализировать ваши результаты в среде MATLAB. Если вы генерируете MEX-функцию от функции, которая вызывает plot
, и затем запустите сгенерированную MEX-функцию, вызовы отправок генератора кода plot
функционируйте к движку MATLAB. Если вы генерируете библиотеку или исполняемый файл, сгенерированный код не содержит вызовы plot
функция.
Если вы генерируете MEX или автономный код C/C++ при помощи MATLAB Coder™, вызовов подсветок отчета генерации кода от вашего кода MATLAB до внешних функций. Путем осмотра отчета можно определить, какие функции поддерживаются только в среде MATLAB.
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
как значение внешних параметров.
function y = myFunction(x) %#codegen coder.extrinsic('foo'); obj = myClass; y = foo(obj,x); end
Нестатические методы также известны как обычные методы. Смотрите Задают Методы класса и Функции.
Используйте coder.extrinsic
создайте к:
Вызовите функции MATLAB, которые не производят выход в процессе моделирования, не генерируя ненужный код.
Сделайте свое самодокументирование кода и легче отладить. Можно отсканировать исходный код для coder.extrinsic
операторы, чтобы изолировать вызовы функций MATLAB, которые могут потенциально создать и распространить mxArrays
. Смотрите Работу с mxArrays (MATLAB Coder).
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
значение внешних параметров для только этого вызова. В отличие от этого, функциональный 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 выходными параметрами.