Когда генератор кода производит код для математических функций:
Если опция модели, Support non-finite numbers выбран, неличная проверка номера, сгенерирована однородно для математических функций без способности указать, что неличная проверка номера должна быть сгенерирована для некоторых функций, но не для других.
По умолчанию встраивание применяется однородно для математических функций без способности указать, что встраивание должно быть сгенерировано для некоторых функций, в то время как вызовы должны быть сгенерированы для других.
Можно использовать записи индивидуальной настройки заменяющей библиотеки кода (CRL) в:
Выборочно отключите неличные проверки на математические функции. Это может улучшить скорость выполнения сгенерированного кода.
Выборочно отключите встраивание математических функций. Это может увеличить удобочитаемость кода и уменьшить размер кода.
Функции, для которых поддерживаются эти индивидуальные настройки, включают следующее:
С плавающей точкой только: atan2
, copysign
фиксация
hypot
журнал
log10
вокруг
, sincos
, и sqrt
С плавающей точкой и целочисленный: abs
Max
min
mod
rem
, saturate
, и sign
Общий рабочий процесс для отключения неличной проверки номера и/или встраивания следующие:
Если можно отключить неличную проверку номера конкретную математическую функцию, или если вы хотите отключить встраивание для конкретной математической функции и вместо этого сгенерировать вызов функции, можно скопировать следующий код функции 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');
Чтобы уменьшать размер файла, можно удалить registerCustomizationEntry
линии для функций, для которых неличный номер по умолчанию проверяющее и встраивающее поведение приемлемо.
Для каждой остающейся записи,
Установите Inline
аргумент к true
если функция должна быть встроена или false
если это не должно быть встроено.
Установите SNF
аргумент к ENABLE
если неличная проверка должна быть сгенерирована, DISABLE
если неличная проверка не должна быть сгенерирована, или UNSPECIFIED
принять поведение по умолчанию на основе настроек опции модели.
Сохраните файл.
Опционально, выполните быструю проверку синтаксической валидности записей таблицы индивидуальной настройки путем вызова табличного файла определения в командной строке MATLAB (>> tbl = crl_table_customization
). Зафиксируйте синтаксические ошибки, которые отмечаются.
Опционально, просмотрите записи таблицы индивидуальной настройки в Code Replacement Viewer (>> crviewer(crl_table_customization)
). Для получения дополнительной информации о просмотре заменяющих таблиц кода, смотрите, Выбирают Code Replacement Library.
Чтобы указать эти изменения и заставить их появиться в 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
Создайте или откройте модель, которая генерирует функциональный код, соответствующий одной из математических функций, для которых вы задали изменение в неличном номере проверяющее или встраивающее поведение.
Откройте диалоговое окно Configuration Parameters, перейдите к Code Generation> панель Interface и используйте Code replacement library выпадающий список, чтобы выбрать заменяющую запись кода, вы указали на шаге 6, например, CRL Customization Example
.
Сгенерируйте код для модели и исследуйте сгенерированный код, чтобы проверить, что математические функции сгенерированы как ожидалось.