Неличная функциональная замена кода

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

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

    function hTable = crl_table_nonfinite()
    
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

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

    %% Create entries for nonfinite utility functions
    % locAddFcnEnt(hTable, key, implName, out, in1, hdr)
    
    locAddFcnEnt(hTable, 'getNaN', 'getNaN', 'double', 'void', 'nonfin.h');
    locAddFcnEnt(hTable, 'getNaN', 'getNaNF', 'single', 'void', 'nonfin.h');
    locAddFcnEnt(hTable, 'getInf', 'getInf',  'double', 'void', 'nonfin.h');
    locAddFcnEnt(hTable, 'getInf', 'getInfF', 'single', 'void', 'nonfin.h');
    locAddFcnEnt(hTable, 'getMinusInf', 'getMinusInf', 'double', 'void', 'nonfin.h');
    locAddFcnEnt(hTable, 'getMinusInf', 'getMinusInfF', 'single', 'void', 'nonfin.h');
    
    %% Local Function
    function locAddFcnEnt(hTable, key, implName, out, in1, hdr)
      if isempty(hTable)
        return;
      end
    
     fcn_entry = RTW.TflCFunctionEntry;
    
  4. Параметры записи функции множества с вызовом функции setTflCFunctionEntryParameters.

     setTflCFunctionEntryParameters(fcn_entry, ...
                                    'Key', key, ...
                                    'Priority', 90, ...
                                    'ImplementationName', implName, ...
                                    'ImplementationHeaderFile', hdr);
    
    
  5. Создайте концептуальные аргументы y1 и u1. Существует несколько способов настроить концептуальные аргументы. Этот пример использует вызовы getTflArgFromString и функций addConceptualArg, чтобы создать и добавить аргументы.

      arg = getTflArgFromString(hTable, 'y1', out);
      arg.IOType = 'RTW_IO_OUTPUT';
      addConceptualArg(fcn_entry, arg);
    
      arg = getTflArgFromString(hTable, 'u1', in1);
      addConceptualArg(fcn_entry, arg);
    
  6. Скопируйте концептуальные аргументы в аргументы реализации. Существует несколько способов настроить аргументы реализации. Этот пример использует вызов функции copyConceptualArgsToImplementation, чтобы создать и добавить аргументы реализации в запись путем копирования соответствия с концептуальными аргументами.

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

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

Протестировать этот пример:

  1. Укажите заменяющее отображение кода.

  2. Создайте модель, которая использует неличную функцию. Например, создайте модель, которая включает блок Math Function, который установлен в функцию rem. Например:

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

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

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

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

  4. В Model Explorer сконфигурируйте Signal Attributes для исходных блоков Constant и In1. Для каждого исходного блока, набор Data type к double. Примените изменения. Сохраните модель.

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

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

Похожие темы