Повторно сопоставьте оператор Вывод с входным параметром функции

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

Примечание

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

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

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

Чтобы протестировать этот пример, создайте модель, которая использует блок Add. Например:

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

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

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

    • На панели Code Generation выберите ERT-based system target file.

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

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

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

  4. Рассмотрите замены кода.

Похожие темы