При обработке вызова функционального foo
в вашем коде MATLAB® генератор кода находит определение foo
и генерирует код для его тела. В некоторых случаях вы можете хотеть обойти генерацию кода и вместо этого использовать движок MATLAB, чтобы выполнить вызов. Используйте coder.extrinsic('foo')
объявить что вызовы foo
не генерируйте код и вместо этого используйте движок MATLAB для выполнения. В этом контексте, foo
упоминается как внешняя функция. Эта функциональность доступна только, когда движок MATLAB доступен в MEX-функциях или во время coder.const
вызовы во время компиляции.
Если вы генерируете автономный код для функции, которая вызывает foo
и включает coder.extrinsic('foo')
, генератор кода пытается определить ли foo
влияет на выход. Если foo
не влияет на выход, доходы генератора кода с генерацией кода, но исключает foo
от сгенерированного кода. В противном случае генератор кода производит ошибку компиляции.
Генератор кода автоматически обрабатывает много общих функций визуализации MATLAB, такой как plot
, disp
, и figure
, как значение внешних параметров. Вы не должны явным образом объявлять их, когда значение внешних параметров функционирует при помощи coder.extrinsic
. Например, вы можете хотеть вызвать plot
визуализировать ваши результаты в среде MATLAB. Если вы генерируете MEX-функцию от функции, которая вызывает plot
, и затем запустите сгенерированную MEX-функцию, вызовы отправок генератора кода plot
функционируйте к движку MATLAB. Если вы генерируете библиотеку или исполняемый файл, сгенерированный код не содержит вызовы plot
функция. Отчет генерации кода подсвечивает вызовы от вашего кода MATLAB до внешних функций так, чтобы было легко определить, какие функции поддерживаются только в среде MATLAB.
Для неподдерживаемых функций кроме общих функций визуализации необходимо объявить, что функции значение внешних параметров (см. Разрешение Вызовов функции для Генерации кода). Внешние функции не скомпилированы, но вместо этого выполнены в MATLAB в процессе моделирования (см. Разрешение Внешних Функций В процессе моделирования).
Существует два способа объявить, что функция значение внешних параметров:
Используйте coder.extrinsic
создайте в основных функциях или локальных функциях (см. Объявление функций MATLAB как Внешние Функции).
Вызовите функцию косвенно с помощью feval
(см., что функции MATLAB Вызова Используют feval).
Чтобы объявить, что функция MATLAB значение внешних параметров, добавьте coder.extrinsic
создайте во главе основной функции или локальной функции:
coder.extrinsic('function_name_1', ... , 'function_name_n');
Следующий код объявляет MATLAB patch
функционируйте значение внешних параметров в локальной функции create_plot
. Вы не должны объявлять axis
как значение внешних параметров, потому что axis
одна из общих функций визуализации, которые генератор кода автоматически обрабатывает как значение внешних параметров.
function c = pythagoras(a,b,color) %#codegen % Calculates the hypotenuse of a right triangle % and displays the triangle. c = sqrt(a^2 + b^2); create_plot(a, b, color); function create_plot(a, b, color) %Declare patch as extrinsic coder.extrinsic('patch'); x = [0;a;a]; y = [0;0;b]; patch(x, y, color); axis('equal');
Генератор кода не производит код для patch
и axis
, но вместо этого отправляет их MATLAB для выполнения.
Чтобы протестировать функцию, выполните эти шаги:
Преобразуйте pythagoras
к MEX-функции путем выполнения этой команды в подсказке MATLAB:
codegen -report pythagoras -args {1, 1, [.3 .3 .3]}
Щелкните по ссылке к отчету генерации кода и затем, в отчете, просмотрите код MATLAB для create_plot
.
Отчет подсвечивает patch
и axis
функции, чтобы указать, что они поддерживаются только в среде MATLAB.
Запустите MEX-функцию путем выполнения этой команды:
pythagoras_mex(3, 4, [1.0 0.0 0.0]);
MATLAB отображает график прямоугольного треугольника как красный объект закрашенной фигуры:
Используйте coder.extrinsic
создайте к:
Вызовите функции MATLAB, которые не производят выход в процессе моделирования, не генерируя ненужный код (см. Разрешение Внешних Функций В процессе моделирования).
Сделайте свое самодокументирование кода и легче отладить. Можно отсканировать исходный код для coder.extrinsic
операторы, чтобы изолировать вызовы функций MATLAB, которые могут потенциально создать и распространить mxArrays
(см. Работу с mxArrays).
Сохраните ввод. С одним coder.extrinsic
оператор, каждый последующий вызов функции является значением внешних параметров, пока вызов и оператор находятся в том же осциллографе (см. Осциллограф Внешних Объявлений функции).
Объявите значение внешних параметров функции (функций) MATLAB в осциллографе функции вызова (см. Осциллограф Внешних Объявлений функции). Чтобы сузить осциллограф, использовать feval
(см., что функции MATLAB Вызова Используют feval).
Наблюдайте следующие правила при объявлении значения внешних параметров функций для генерации кода:
Объявите функциональное значение внешних параметров, прежде чем вы вызовете его.
Не используйте внешнее объявление в условных операторах.
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
.
Вызовите использование функции MATLAB feval
, как описано в Вызове функций MATLAB Используя 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
вызывать локальные функции или функции, которые расположены в частной папке.
Предположим, что вы задаете класс 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
Нестатические методы также известны как обычные методы. Смотрите Задают Методы класса и Функции.
Генератор кода разрешает вызовы внешних функций — функции, которые не поддерживают генерацию кода — можно следующим образом:
В процессе моделирования генератор кода производит код для вызова внешней функции, но не генерирует внутренний код для функции. Поэтому можно запустить симуляцию только на платформах, где вы устанавливаете программное обеспечение MATLAB.
Во время генерации кода генератор кода пытается определить, влияет ли внешняя функция на выход функции, в которой это называется — например, путем возврата mxArrays
к выходной переменной (см. Работу с mxArrays). При условии, что выход не изменяется, доходы генерации кода, но внешняя функция исключена из сгенерированного кода. В противном случае генератор кода выпускает ошибку компилятора.
Выходом внешней функции является mxArray
— также названный массивом MATLAB. Единственные допустимые операции для mxArrays
:
Хранение mxArrays
в переменных
Передача mxArrays
к функциям и возврату их от функций
Преобразование mxArrays
к известным типам во время выполнения
Использовать mxArrays
возвращенный внешними функциями в других операциях, необходимо сначала преобразовать их в известные типы, как описано в Преобразовании mxArrays к Известным Типам.
Преобразовывать mxArray
к известному типу присвойте mxArray
к переменной, тип которой задан. Во время выполнения, mxArray
преобразован в тип переменной, присвоенной ему. Однако, если данные в mxArray
не сопоставимо с типом переменной, вы получаете ошибку времени выполнения.
Например, рассмотрите этот код:
function y = foo %#codegen coder.extrinsic('rat'); [N D] = rat(pi); y = min(N, D);
Здесь, функция верхнего уровня foo
вызывает внешнюю функцию rat
, который возвращает два mxArrays
представление числителя N
и знаменатель D
из рационального дробного приближения pi
. Несмотря на то, что можно передать их mxArrays
к другой функции MATLAB — в этом случае, min
— вы не можете присвоить mxArray
возвращенный min
к выходу y
.
Если при запуске этот функциональный foo
в блоке MATLAB function в модели Simulink® код генерирует следующую ошибку в процессе моделирования:
Function output 'y' cannot be of MATLAB type.
Чтобы решить эту проблему, задайте 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
Измените предупреждение состояний
Измените настройки MATLAB
Измените параметры Simulink
Генератор кода не поддерживает использование coder.extrinsic
вызывать функции, которые расположены в частной папке.
Генератор кода не поддерживает использование coder.extrinsic
вызывать локальные функции.
Можно вызвать функции максимум с 64 входными параметрами и 64 выходными параметрами.