exponenta event banner

coder.replace

Замена текущей реализации функции MATLAB функцией библиотеки замены кода в сгенерированном коде

Описание

пример

coder.replace(ifNoReplacement) заменяет текущую реализацию функции функцией библиотеки замены кода.

Во время создания кода при вызове coder.replace в функции MATLAB ® генератор кода выполняет поиск в библиотеке замены кода для сигнатуры функции :

[y1_type, y2_type,..., yn_type]=fcn(x1_type, x2_type,...,xn_type)
Типы входных данных: x1_type, x2_type,...,xn_type и типы выходных данных, полученные из реализации: y1_type, y2_type,..., yn_type. Если совпадение для функции MATLAB обнаружено в зарегистрированной библиотеке замены кода, содержимое функции MATLAB отбрасывается и заменяется вызовом функции библиотеки замены кода. Если совпадение не найдено, код создается без замены.

coder.replace влияет только на генерацию кода и не изменяет генерацию кода MATLAB или функции MEX. coder.replace предназначен для замены функции MATLAB, которая имеет поведение, эквивалентное ее реализации функции замены. Если тело функции MATLAB пусто или не эквивалентно реализации функции замены, оно может быть исключено из сгенерированного кода. Для моделирования используется функция MATLAB перед заменой. Вы несете ответственность за проверку числового результата моделирования и создания кода после замены.

Примеры

свернуть все

Замените функцию MATLAB пользовательской реализацией, зарегистрированной в библиотеке замены кода.

Напишите функцию MATLAB, calculate, которую вы хотите заменить пользовательской реализацией, replacement_calculate_impl.c, в сгенерированном коде.

function y = calculate(x)
% Search in the code replacement library for replacement
% and use replacement function if available
% Error if not found
  coder.replace('-errorifnoreplacement');
  y = sqrt(x);
end

Напишите функцию MATLAB, top_function, что вызывает calculate.

function out = top_function(in)
  p = calculate(in);
  out = exp(p);
end

Создание файла с именем crl_table_calculate.m содержит описание функциональных записей для таблицы замены кода. Функция замены replacement_calculate_impl.c и файл заголовка replacement_calculate_impl.h должен находиться на пути.

hLib = RTW.TflTable;

%---------- entry: calculate ----------- 
hEnt = RTW.TflCFunctionEntry;
setTflCFunctionEntryParameters(hEnt, ...
  'Key', 'calculate', ...
  'Priority', 100, ...
  'ArrayLayout', 'COLUMN_MAJOR', ...
  'ImplementationName', ...
  'replacement_calculate_impl', ...
  'ImplementationHeaderFile', ...
  'replacement_calculate_impl.h', ...
  'ImplementationSourceFile', ...
  'replacement_calculate_impl.c')
% Conceptual Args

arg = getTflArgFromString(hEnt, 'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
addConceptualArg(hEnt, arg);

arg = getTflArgFromString(hEnt, 'u1','double');
addConceptualArg(hEnt, arg);

% Implementation Args 

arg = getTflArgFromString(hEnt, 'y1','double');
arg.IOType = 'RTW_IO_OUTPUT';
hEnt.Implementation.setReturn(arg); 

arg = getTflArgFromString(hEnt, 'u1','double');
hEnt.Implementation.addArgument(arg);

addEntry(hLib, hEnt);

Создание rtwTargetInfo файл:

function rtwTargetInfo(tr)
% rtwTargetInfo function to register a code 
% replacement library (CRL) 
% for use with codegen

  % Register the CRL defined in local function locCrlRegFcn
  tr.registerTargetInfo(@locCrlRegFcn);

end % End of RTWTARGETINFO

function thisCrl = locCrlRegFcn

  % Instantiate a CRL registry entry
  thisCrl = RTW.TflRegistry;

  % Define the CRL properties
  thisCrl.Name = 'My calculate Example'; 
  thisCrl.Description = 'Demonstration of function replacement';
  thisCrl.TableList = {'crl_table_calculate'};
  thisCrl.BaseTfl = 'C89/C90 (ANSI)';
  thisCrl.TargetHWDeviceType = {'*'};

end % End of LOCCRLREGFCN

Обновить сведения о регистрации. В командной строке MATLAB введите:

RTW.TargetRegistry.getInstance('reset'); 

Потому что тип данных x и y является double, coder.replace поиск double = calculate(double) в библиотеке замены кода. Если найдёт совпадение, codegen генерирует следующий код:

real_T top_function(real_T in)
{
  real_T p;
  p = replacement_calculate_impl(in);
  return exp(p);
}

В созданном коде функция замены replacement_calculate_impl заменяет функцию MATLAB calculate.

Входные аргументы

свернуть все

ifNoReplacement определяет, выдает ли генератор кода ошибку или предупреждение, если совпадение не найдено. Если этот аргумент опущен, генератор кода не выдает ошибку или предупреждение.

coder.replace('-errorifnoreplacement') заменяет текущую реализацию функции функцией библиотеки замены кода. Если совпадение не найдено, создание кода прекращается. Генерируется сообщение об ошибке, описывающее сбой поиска в библиотеке замены кода.

coder.replace('-warnifnoreplacement') заменяет текущую реализацию функции функцией библиотеки замены кода. Если совпадение не найдено, генерируется код для текущей функции. Во время создания кода генерируется предупреждение, описывающее ошибку поиска в библиотеке замены кода.

Пример: coder.replace()

Совет

  • coder.replace требуется лицензия Embedded Coder ®.

  • coder.replace является функцией генерации кода и не изменяет код MATLAB или генерацию функции MEX.

  • coder.replace не предназначен для многократного вызова в рамках функции.

  • coder.replace не предназначен для использования в условных выражениях и циклах.

  • coder.replace не поддерживает режимы насыщения и округления при поиске библиотеки замены кода.

  • coder.replace не поддерживает varargout.

  • coder.replace не поддерживает замену функции, требующую выравнивания данных.

  • coder.replace не поддерживает замену функций MATLAB входами переменного размера.

Представлен в R2012b