Внешние функции

При обработке вызова функционального 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 в процессе моделирования (см. Разрешение Внешних Функций В процессе моделирования).

Существует два способа объявить, что функция значение внешних параметров:

При объявлении функций MATLAB, когда функционирует значение внешних параметров

Чтобы объявить, что функция 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 для выполнения.

Чтобы протестировать функцию, выполните эти шаги:

  1. Преобразуйте pythagoras к MEX-функции путем выполнения этой команды в подсказке MATLAB:

    codegen -report pythagoras -args {1, 1, [.3 .3 .3]}

  2. Щелкните по ссылке к отчету генерации кода и затем, в отчете, просмотрите код MATLAB для create_plot.

    Отчет подсвечивает patch и axis функции, чтобы указать, что они поддерживаются только в среде MATLAB.

  3. Запустите MEX-функцию путем выполнения этой команды:

    pythagoras_mex(3, 4, [1.0 0.0 0.0]);

    MATLAB отображает график прямоугольного треугольника как красный объект закрашенной фигуры:

Когда Использовать Построение coder.extrinsic

Используйте coder.extrinsic создайте к:

Правила для внешних объявлений функции

Наблюдайте следующие правила при объявлении значения внешних параметров функций для генерации кода:

  • Объявите функциональное значение внешних параметров, прежде чем вы вызовете его.

  • Не используйте внешнее объявление в условных операторах.

Осциллограф внешних объявлений функции

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.

Вызов функций 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). При условии, что выход не изменяется, доходы генерации кода, но внешняя функция исключена из сгенерированного кода. В противном случае генератор кода выпускает ошибку компилятора.

Работа с mxArrays

Выходом внешней функции является mxArray — также названный массивом MATLAB. Единственные допустимые операции для mxArrays :

  • Хранение 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 выходными параметрами.