Если ваш сгенерированный код должен соответствовать определенному шаблону кодирования, или вы хотите, чтобы больше гибкости, например, далее улучшало производительность, можно повторно сопоставить оператор выходные параметры, чтобы ввести положения в списке аргументов функции реализации.
Переотображение выходных параметров к входным параметрам функции реализации поддерживается только для замены оператора.
Например, для операции суммы, генератор кода производит код, похожий на:
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
уменьшать копии данных в сгенерированном коде.
Сгенерируйте код и отчет генерации кода.
Рассмотрите замены кода.