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

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

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

  • Блок Trigonometric Function, с набором Function к sinпотому что, или 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);
}

Похожие темы