Преобразование выхода оператора во входной параметр функции

Если ваш сгенерированный код должен соответствовать определенному шаблону кодирования или вы хотите большей гибкости, например, для дальнейшего улучшения эффективности, можно перенаправить выходы оператора во входные положения в списке аргументов функции реализации.

Примечание

Изменение выходов на входные параметры функции реализации поддерживается только для замены оператора.

Для примера для операции с суммой генератор кода производит код, подобный:

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 как первый входной аргумент функции.

  1. Создайте файл определения таблицы, который содержит описание функции. Для примера:

    function hTable = crl_table_add_uint8
  2. В теле функции создайте таблицу, вызвав функцию RTW.TflTable.

    hTable = RTW.TflTable;
    
  3. Создайте запись для отображения оператора с вызовом на RTW.TflCOperationEntry функция.

    % Create operation entry 
    op_entry = RTW.TflCOperationEntry;
  4. Установите параметры входа оператора с вызовом 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 );
  5. Создайте концептуальные аргументы 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 );
  6. Создайте аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызовы к 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);
  7. Добавьте запись в таблицу замещения кода с вызовом в addEntry функция.

    addEntry(hTable, op_entry);
  8. Сохраните файл определения таблицы. Используйте имя функции определения таблицы, чтобы назвать файл.

Чтобы протестировать этот пример:

  1. Зарегистрируйте отображение замещения кода.

  2. Создайте модель, которая включает в себя Add блок.

  3. Сконфигурируйте модель со следующими настройками:

    • На панели Solver выберите решатель с фиксированным шагом.

    • На панели Code Generation выберите системный целевой файл на основе ERT.

    • На панели Code Generation > Interface выберите библиотеку замещения кода, содержащую запись операции сложения.

    • Установите параметр Optimize global data access равным Use global to hold temporary results чтобы уменьшить количество копий данных в сгенерированном коде.

  4. Сгенерируйте код и отчет генерации кода.

  5. Проверьте замены кода.

Похожие темы