В этом примере показано, как использовать замену кода, чтобы заменить функцию MATLAB®, заданную в блоке MATLAB function.
Откройте ex_replace
модель. В командной строке, введите:
addpath(fullfile(docroot,'toolbox','ecoder','examples')) ex_replace
Просмотрите код блока MATLAB function. В модели дважды кликните блок MATLAB Function, чтобы просмотреть код в редакторе MATLAB.
function y = customFcn(u1, u2) %#codegen % This block supports MATLAB for code generation. % Replace this MATLAB function with CRL replacement function and if no % CRL replacement is found, generate an error during code generation. coder.replace('-errorifnoreplacement'); assert(isa(u1,'int32')); assert(isa(u2,'int32')); y = power(u1,u2);
coder.replace('-errorifnoreplacement')
оператор дает генератору кода команду заменять эту функцию MATLAB на заменяющую библиотечную функцию кода. Генератор кода производит ошибку, если он не находит соответствие.
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hTable = crl_table_coderreplace()
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hTable = RTW.TflTable;
Создайте запись для отображения функции с вызовом RTW.TflCFunctionEntry
функция.
hEnt = RTW.TflCFunctionEntry;
Параметры записи функции множества с вызовом setTflCFunctionEntryParameters
функция.
setTflCFunctionEntryParameters(hEnt, ... 'Key', 'customFcn', ... 'Priority', 100, ... 'ImplementationName', 'scalarFcnReplacement', ... 'ImplementationHeaderFile', 'MyMath.h', ... 'ImplementationSourceFile', 'MyMath.c')
Создайте концептуальные аргументы y1
, u1
, и u2
. Этот пример использует вызовы getTflArgFromString
и addConceptualArg
функции, чтобы создать и добавить аргументы.
arg = getTflArgFromString(hEnt, 'y1','int32'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(hEnt, arg); arg = getTflArgFromString(hEnt, 'u1','int32'); addConceptualArg(hEnt, arg); arg = getTflArgFromString(hEnt, 'u2','int32'); addConceptualArg(hent, arg);
Создайте аргументы реализации и добавьте их в запись. Этот пример использует вызовы getTflArgFromString
функция, чтобы создать аргументы реализации, которые сопоставляют с аргументами в заменяющем прототипе функции: выходной аргумент void
, входные параметры u1
и u2
, и выходной аргумент y1
. Удобные методы setReturn
и addArgument
задайте, является ли аргумент возвращаемым значением или аргументом. addArgument
функция также добавляет каждый аргумент в массив записи аргументов реализации.
arg = getTflArgFromString(hEnt, 'void','void'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setReturn(arg); arg = getTflArgFromString(hEnt, 'u1','int32'); hEnt.Implementation.addArgument(arg); arg = getTflArgFromString(hEnt, 'u2','int32'); hEnt.Implementation.addArgument(arg); arg = getTflArgFromString(hEnt, 'y1','int32*'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.addArgument(arg);
Добавьте запись в заменяющую таблицу кода с вызовом addEntry
функция.
addEntry(hLib, hEnt);
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.
Протестировать пример:
Укажите заменяющее отображение кода.
Создайте файлы MyMath.c
и MyMath.h
это задает заменяющую функцию, scalarFcnReplacement
, который имеет два int32
входные параметры и один int32
вывод .
MyMath.c
#include "MyMath.h" void scalarFcnReplacement(int32_T u1, int32_T u2, int32_T* y1 ) { *y1 = u1^u2; }
MyMath.h
#ifndef _ScalarMath_h #define _ScalarMath_h #include "rtwtypes.h" #ifdef __cplusplus extern "C" { #endif extern void scalarFcnReplacement(int32_T u1, int32_T u2, int32_T* y1); #ifdef __cplusplus } #endif #endif
Откройте ex_replace
модель.
Сконфигурируйте генератор кода, чтобы пользоваться заменяющей библиотекой кода и включать Заменяющий Отчет Кода в отчет генерации кода.
Сгенерируйте заменяющий код и отчет генерации кода.
Рассмотрите замены кода. В отчете генерации кода просмотрите сгенерированный код для ex_replace.c
.
void ex_replace_step(void) { int32_T y; scalarFcnReplacement(ex_replace_U.In1, ex_replace_U.In2, &y); ex_replace_Y.Out1 = y; }