exponenta event banner

Использование механизма MATLAB для выполнения вызова функции в сгенерированном коде

При обработке вызова функции foo в коде MATLAB ® генератор кода находит определение foo и генерирует код для своего тела. В некоторых случаях может потребоваться обойти генерацию кода и вместо этого использовать механизм MATLAB для выполнения вызова. Использовать coder.extrinsic('foo') для объявления этого вызова foo не создавайте код и используйте для выполнения механизм MATLAB. В этом контексте foo называется внешней функцией. Эта функция доступна только в том случае, если модуль MATLAB доступен во время выполнения. Примеры таких ситуаций включают выполнение функций MEX, моделирование Simulink ® или вызовы функций во время генерации кода (также известное как время компиляции).

При создании автономного кода для функции, вызывающей 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 как внешнее, включите это утверждение в свой код MATLAB.

coder.extrinsic('foo')

Объявляя функции как внешние для генерации кода, придерживайтесь следующих правил:

  • Перед вызовом функции объявите ее внешней.

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

  • Присвойте возвращаемое значение внешней функции известному типу. См. раздел Работа с mxArrays.

Дополнительные сведения и примеры см. в разделе coder.extrinsic.

Генератор кода автоматически обрабатывает многие общие функции визуализации MATLAB, такие как plot, disp, и figure, как внешний. Нет необходимости явно объявлять их как внешние функции с помощью coder.extrinsic. Например, может потребоваться позвонить plot для визуализации результатов в среде MATLAB. При создании функции MEX из функции, вызывающей plot, а затем запустить сгенерированную функцию MEX, генератор кода отправляет вызовы plot функция для модуля MATLAB. При создании библиотеки или исполняемого файла созданный код не содержит вызовов plot функция.

При создании кода MEX или автономного кода C/C + + с помощью Coder™ MATLAB отчет о создании кода выделяет вызовы из кода 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 с помощью 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

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

  • Хранение mxArray в переменной.

  • Прохождение mxArray функции.

  • Возвращение mxArray из функции обратно в MATLAB.

  • Преобразование mxArray к известному типу во время выполнения. Для выполнения этого действия назначьте mxArray переменной, тип которой уже определен предыдущим назначением. См. пример ниже.

Использование mxArray возвращаемый внешней функцией в других операциях (например, возвращая ее из блока MATLAB Function для выполнения Simulink), необходимо сначала преобразовать ее в известный тип.

Если входными аргументами функции являются mxArrays, генератор кода автоматически рассматривает функцию как внешнюю.

Преобразование массивов mxArray в известные типы

Преобразование 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 можно непосредственно присвоить эту функцию. 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 выходами.

См. также

|