Отключите неличные проверки или встраивающий для математических функций

Когда генератор кода производит код для математических функций:

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

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

Можно использовать записи индивидуальной настройки заменяющей библиотеки кода (CRL) в:

  • Выборочно отключите неличные проверки на математические функции. Это может улучшить скорость выполнения сгенерированного кода.

  • Выборочно отключите встраивание математических функций. Это может увеличить удобочитаемость кода и уменьшить размер кода.

Функции, для которых поддерживаются эти индивидуальные настройки, включают следующее:

  • С плавающей точкой только: atan2, copysign, fix, hypot, log, log10, round, sincos и sqrt

  • С плавающей точкой и целочисленный: abs, max, min, mod, rem, saturate и sign

Общий рабочий процесс для отключения неличной проверки номера и/или встраивания следующие:

  1. Если можно отключить неличную проверку номера конкретную математическую функцию, или если вы хотите отключить встраивание для конкретной математической функции и вместо этого сгенерировать вызов функции, можно скопировать следующий код функции MATLAB® в файл MATLAB с расширением файла .m, например, crl_table_customization.m.

    function hTable = crl_table_customization
        
    % Create an instance of the Code Replacement Library table for controlling
    % function intrinsic inlining and nonfinite support
    
    hTable = RTW.TflTable;
    
    % Inline - true (if function needs to be inline)
    %          false (if function should not be inlined)
    % SNF (support nonfinite) - ENABLE (if non-finite checking should be performed)
    %                           DISABLE (if non-finite checking should NOT be performed)
    %                           UNSPECIFIED (Default behavior)
    
    % registerCustomizationEntry(hTable, ...
    %       Priority, numInputs, key, inType, outType, Inline, SNF);
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'atan2', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'atan2', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sincos', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sincos', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'single', 'single', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'integer','integer',true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'abs', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'hypot', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'hypot', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'log', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'log', 'single', 'double', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'log10', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'log10', 'single', 'double', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'min', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'max', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'single', 'single', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int32',  'int32',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int16',  'int16',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'int8',   'int8',   false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint32', 'uint32', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint16', 'uint16', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'mod', 'uint8',  'uint8',  false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'single', 'single', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int32',  'int32',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int16',  'int16',  false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'int8',   'int8',   false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint32', 'uint32', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint16', 'uint16', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 2, 'rem', 'uint8',  'uint8',  false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'round', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'round', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'single', 'single', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int32',  'int32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int16',  'int16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'int8',   'int8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint32', 'uint32', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint16', 'uint16', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'uint8',  'uint8',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 3, 'saturate', 'integer','integer',true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'double', 'double',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'single', 'single',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int32',  'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int16',  'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'int8',   'integer', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint32', 'uint32',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint16', 'uint16',  true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'uint8',  'uint8',   true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sign', 'integer','integer', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'sqrt', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'sqrt', 'single', 'single', true, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'fix', 'double', 'double', false, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'fix', 'single', 'single', false, 'UNSPECIFIED');
    
    registerCustomizationEntry(hTable, ...
            100, 1, 'copysign', 'double', 'double', true, 'UNSPECIFIED');
    registerCustomizationEntry(hTable, ...
            100, 1, 'copysign', 'single', 'single', true, 'UNSPECIFIED');
  2. Чтобы уменьшать размер файла, можно удалить строки registerCustomizationEntry для функций, для которых неличный номер по умолчанию проверяющее и встраивающее поведение приемлемо.

  3. Для каждой остающейся записи,

    • Установите аргумент Inline на true, если функция должна быть встроена или false, если это не должно быть встроено.

    • Установите аргумент SNF на ENABLE, если неличная проверка должна быть сгенерирована, DISABLE, если неличная проверка не должна быть сгенерирована, или UNSPECIFIED, чтобы принять поведение по умолчанию на основе образцовых настроек опции.

    Сохраните файл.

  4. Опционально, выполните быструю проверку синтаксической валидности записей таблицы индивидуальной настройки путем вызова табличного файла определения в командной строке MATLAB (>> tbl = crl_table_customization). Зафиксируйте синтаксические ошибки, которые отмечаются.

  5. Опционально, просмотрите записи таблицы индивидуальной настройки в Code Replacement Viewer (>> crviewer(crl_table_customization)). Для получения дополнительной информации о просмотре заменяющих таблиц кода, смотрите, Выбирают Code Replacement Library.

  6. Чтобы указать эти изменения и заставить их появиться в Code replacement library выпадающий список, расположенный на Code Generation> панель Interface диалогового окна Configuration Parameters, сначала скопируйте следующий код функции MATLAB в экземпляр файла rtwTargetInfo.m.

    Примечание

    Для примера ниже, задайте аргумент 'RTW', если цель GRT выбрана для вашей модели, в противном случае не используйте аргумент.

    function rtwTargetInfo(cm)
    % rtwTargetInfo function to register a code replacement library (CRL)
    
      % Register the CRL defined in local function locCrlRegFcn
      cm.registerTargetInfo(@locCrlRegFcn);
    
    end % End of RTWTARGETINFO
    
    
    % Local function to define a CRL containing crl_table_customization
    function thisCrl = locCrlRegFcn
    
      % Instantiate a CRL registry entry - specify 'RTW' for GRT
      thisCrl = RTW.TflRegistry('RTW');
    
      % Define the CRL properties
      thisCrl.Name = 'CRL Customization Example';
      thisCrl.Description = 'Example  of CRL Customization';
      thisCrl.TableList = {'crl_table_customization'};
      thisCrl.TargetHWDeviceType = {'*'};
      
    end % End of LOCCRLREGFCN

    Можно отредактировать поле Name, чтобы задать имя библиотеки, которое появляется в Code replacement library выпадающий список. Кроме того, имя файла в поле TableList должно совпадать с именем файла, который вы создали на шаге 1.

    Чтобы указать ваши изменения, с обоими из файлов MATLAB, вы создали подарок в пути MATLAB, введите следующую команду в командной строке MATLAB:

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

  8. Откройте диалоговое окно Configuration Parameters, перейдите к Code Generation> панель Interface и используйте Code replacement library выпадающий список, чтобы выбрать заменяющую запись кода, вы указали на шаге 6, например, CRL Customization Example.

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