Если ваш сгенерированный код должен соответствовать определенному шаблону кодирования, или вы хотите, чтобы больше гибкости, например, далее улучшало производительность, можно повторно сопоставить оператор выходные параметры, чтобы ввести положения в списке аргументов функции реализации.
Переотображение выходных параметров к входным параметрам функции реализации поддерживается только для замены оператора.
Например, для операции суммы, генератор кода производит код, подобный:
add8_Y.Out1 = u8_add_u8_u8(add8_U.In1, add8_U.In2);
Если вы повторно сопоставляете вывод с первым входом, генератор кода производит код, подобный:
u8_add_u8_u8(&add8_Y.Out1;, add8_U.In1, add8_U.In2);
Файл определения следующей таблицы для операции суммы повторно сопоставляет оператор вывод y1
как первый входной аргумент функции.
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hTable = crl_table_add_uint8
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hTable = RTW.TflTable;
Создайте запись для отображения оператора с вызовом функции RTW.TflCOperationEntry
.
% Create operation entry
op_entry = RTW.TflCOperationEntry;
Установите параметры записи оператора с вызовом функции setTflCOperationEntryParameters
. В вызове функции, набор свойство SideEffects
к true
.
setTflCOperationEntryParameters(op_entry, ... 'Key', 'RTW_OP_ADD', ... 'Priority', 90, ... 'ImplementationName', 'u8_add_u8_u8', ... 'ImplementationHeaderFile', 'u8_add_u8_u8.h', ... 'ImplementationSourceFile', 'u8_add_u8_u8.c', ... 'SideEffects', true );
Создайте концептуальные аргументы y1
, u1
и u2
. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы getTflArgFromString
и функций addConceptualArg
, чтобы создать и добавить аргументы.
arg = getTflArgFromString(hTable, 'y1', 'uint8'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(op_entry, arg); arg = getTflArgFromString(hTable, 'u1', 'uint8'); addConceptualArg(op_entry, arg ); arg = getTflArgFromString(hTable, 'u2', 'uint8'); addConceptualArg(op_entry, arg );
Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы функции getTflArgFromString
, чтобы создать аргументы. При определении возвращаемого аргумента функции реализации задайте новый выходной аргумент void
, например, y2
. При определении аргумента функции реализации для концептуального выходного аргумента (y1
), набор выходной аргумент оператора как дополнительный входной параметр. Отметьте его IOType
, как выведено. Сделайте его тип типом указателя. setReturn
удобных методов и addArgument
задают, является ли аргумент возвращаемым значением или аргументом и добавляет аргумент в массив записи аргументов реализации.
% Create new void output y2 arg = getTflArgFromString(hTable, 'y2', 'void'); arg.IOType = 'RTW_IO_OUTPUT'; op_entry.Implementation.setReturn(arg); % Set y1 as first input arg, mark IOType as output, and use pointer type arg=getTflArgFromString(hTable, 'y1', 'uint8*'); arg.IOType = 'RTW_IO_OUTPUT'; op_entry.Implementation.addArgument(arg); arg=getTflArgFromString(hTable, 'u1', 'uint8'); op_entry.Implementation.addArgument(arg); arg=getTflArgFromString(hTable, 'u2', 'uint8'); op_entry.Implementation.addArgument(arg);
Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry
.
addEntry(hTable, op_entry);
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.
Протестировать этот пример:
Укажите заменяющее отображение кода.
Создайте модель, которая включает блок Add.
Сконфигурируйте модель со следующими настройками:
На панели Solver выберите решатель фиксированного шага.
На панели Code Generation выберите ERT-based system target file.
На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу запись операции сложения.
Установите параметр Optimize global data access на Use global to hold temporary results
, чтобы уменьшать копии данных в сгенерированном коде.
Сгенерируйте код и отчет генерации кода.
Рассмотрите замены кода.