Если ваш сгенерированный код должен соответствовать определенному шаблону кодирования или вы хотите большей гибкости, например, для дальнейшего улучшения эффективности, можно перенаправить выходы оператора во входные положения в списке аргументов функции реализации.
Примечание
Изменение выходов на входные параметры функции реализации поддерживается только для замены оператора.
Для примера для операции с суммой генератор кода производит код, подобный:
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.
На панели Code Generation > Interface выберите библиотеку замещения кода, содержащую запись операции сложения.
Установите параметр Optimize global data access равным Use global to hold temporary results
чтобы уменьшить количество копий данных в сгенерированном коде.
Сгенерируйте код и отчет генерации кода.
Проверьте замены кода.