Этот пример показывает, как использовать замену кода, чтобы заменить функцию 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; }