Основанная на алгоритме замена кода

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

  • Блок Reciprocal Sqrt, чтобы использовать Newton-Raphson или метод вычисления Exact.

  • Блок Trigonometric Function, с набором Function к sin, cos, или sincos, чтобы использовать метод приближения CORDIC или None.

Можно задать заменяющие записи кода, чтобы заменить эти функции для одной или всех доступных методов вычисления. Например, можно задать запись, чтобы заменить только экземпляры Newton-Raphson функции rSqrt.

Чтобы установить алгоритм для функции в определении записи, используйте свойство EntryInfoAlgorithm в вызове функционального setTflCFunctionEntryParameters. В следующей таблице перечислены аргументы для определения метода вычисления, чтобы соответствовать во время генерации кода.

ФункцияАргумент
rSqrt
  • 'RTW_DEFAULT' (совпадают с методом вычисления по умолчанию, Exact),

  • 'RTW_NEWTON_RAPHSON'

  • 'RTW_UNSPECIFIED' (совпадают с любым методом вычисления),

sin
cos
sincos
  • 'RTW_CORDIC'

  • 'RTW_DEFAULT' (совпадают с методом приближения по умолчанию, None),

  • 'RTW_UNSPECIFIED' (совпадают с любым методом приближения),

Например, чтобы заменить только экземпляры Newton-Raphson функции rSqrt, создайте запись можно следующим образом:

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

    function hTable = crl_rsqrt()
    %CRL_TABLE_RSQRT - Define function entry for code replacement table.
    
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

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

    % Create entry for rsqrt function replacement
    fcn_entry = RTW.TflCFunctionEntry;
  4. Параметры записи функции множества с вызовом функции setTflCFunctionEntryParameters.

    setTflCFunctionEntryParameters(fcn_entry, ...
      'Key',                      'rSqrt', ...
      'Priority',                 80, ...
      'ImplementationName',       'rsqrt_newton', ...
      'ImplementationHeaderFile', 'rsqrt.h', ...
      'EntryInfoAlgorithm',       'RTW_NEWTON_RAPHSON');
    
  5. Создайте концептуальные аргументы y1 и u1. Этот пример использует вызовы функции createAndAddConceptualArg, чтобы создать и добавить аргумент с одним вызовом функции.

    createAndAddConceptualArg(fcn_entry, 'RTW.TflArgNumeric', ...
      'Name',         'y1', ...
      'IOType',       'RTW_IO_OUTPUT', ...
      'DataTypeMode', 'double');
    
    createAndAddConceptualArg(e, 'RTW.TflArgNumeric', ...
      'Name',         'u1', ...
      'DataTypeMode', 'double');
    
  6. Скопируйте концептуальные аргументы в аргументы реализации. Этот пример использует вызов функции copyConceptualArgsToImplementation, чтобы создать и добавить аргументы реализации в запись путем копирования соответствия с концептуальными аргументами.

    copyConceptualArgsToImplementation(fcn_entry);
    
  7. Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry.

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

Сгенерированный код для экземпляра Newton-Raphson функции rSqrt похож на следующий код:

/* Model step function */
void mrsqrt_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Inport: '<Root>/In1'
   *  Sqrt:   '<Root>/rSqrtBlk'
   */
  mrsqrt_Y.Out1 = rsqrt_newton(mrsqrt_U.In1);
}

Похожие темы