Разработка и использование библиотек замены кода для замены функции и операторов в сгенерированном коде. Замена кода - это метод изменения кода, создаваемого генератором кода для функций и операторов в соответствии с требованиями прикладного кода. Например, можно заменить созданный код в соответствии со следующими требованиями:
Оптимизация для конкретной среды выполнения, включая, но не ограничиваясь этим, конкретное целевое оборудование
Интеграция с существующим кодом приложения
Соответствие стандарту, например AUTOSAR
Изменение поведения кода, например, включение или отключение поддержки non finite или inline
Требования к прикладным или проектным кодам, такие как использование BLAS или исключение math.h, системные заголовочные файлы или вызовы memcpy или memset.
Модель можно настроить так, чтобы генератор кода использовал библиотеку замены кода, предоставляемую MathWorks ®. Если у вас есть лицензия Embedded Coder ®, вы можете разработать собственную библиотеку замены кода в интерактивном режиме с помощью средства замены кода или программным способом.
В этом примере модели используются для демонстрации различных способов программного определения сопоставлений замены кода. Каждая модель включает кнопки, которые можно использовать для
Просмотр определений таблиц библиотеки замены кода из средства просмотра замены кода
Открыть файл определения таблицы библиотеки в редакторе
Открыть файл регистрации библиотеки в редакторе
Просмотр конфигурации модели
Создать код
Дополнительные сведения см. в разделах Определение оптимизации библиотеки замены кода и Регистрация библиотеки замены кода.
Определите требования к замене кода в отношении функциональных или операционных сопоставлений, сведений о сборке и регистрационных данных.
Подготовка к разработке библиотеки замены кода (например, определение или разработка моделей для тестирования библиотеки).
Определение сопоставлений замены кода.
Укажите сведения о построении для кода замены.
Регистрация сопоставлений замены кода.
Проверьте замены кода.
Развертывание библиотеки.
Дополнительные сведения см. в разделе Разработка библиотеки замены кода быстрого запуска - Simulink ®.
В этом примере определяются и регистрируются сопоставления замены кода для математических функций. Можно определить сопоставления замены кода для различных функций (см. Код, который можно заменить из моделей Simulink).
Открытие модели rtwdemo_crlmath и используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
Дополнительные сведения см. в разделе Замена кода математической функции.
open_system('rtwdemo_crlmath')

В этом примере показано, как определить и зарегистрировать сопоставления замены кода для операций сложения (+) и вычитания (-). При определении записей для операций сложения и вычитания можно указать, какой из следующих алгоритмов (EntryInfoAlgorithm) функции библиотеки реализуют:
Литой перед работой (КБО) (RTW_CAST_BEFORE_OP), значение по умолчанию
Литой после эксплуатации (САО) (RTW_CAST_AFTER_OP)
1. Открытие модели rtwdemo_crladdsub. Модель показывает, как определить и зарегистрировать сопоставления замены кода для операций вычитания скалярного сложения (-) для двух операндов со следующими парами встроенных целочисленных типов данных:
int8, uint8
int16, uint16
int32, uint32
Предполагается CBO, алгоритм по умолчанию.
open_system('rtwdemo_crladdsub')

2. Используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
3. Изучите различия между алгоритмами CBO и CAO, открыв модель rtwdemo_crl_cbo_cao. Модель показывает два блока SUM, каждый из которых демонстрирует одну из настроек алгоритма для соответствия соответствующей записи замены кода.
Для Cast_before_operation_Sub блок, генератор кода вычисляет операцию вычитания в типе данных накопителя (int8), который меньше типа входных данных (int16). Это эквивалентно CBO, поскольку перед вычислением результата генератор кода преобразует входные данные в тип выходных данных.
Для Cast_after_operation_Sub блок, генератор кода вычисляет операцию вычитания в типе данных накопителя (int32), что больше, чем тип входных данных (int16). Это эквивалентно CAO, поскольку генератор кода выдает тот же результат путем вычисления результата без потери диапазона или точности перед преобразованием в тип выходных данных.
open_system('rtwdemo_crl_cbo_cao')

4. Используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
Дополнительные сведения о замене оператора сложения и вычитания см. в разделе Замена кода оператора сложения и вычитания. Для получения дополнительной информации об алгоритме сложения и вычитания (EntryInfoAlgorithm) параметры, см. setTflCOperationEntryParameters.
В этом примере определяются и регистрируются сопоставления замены кода для операций скалярного умножения (*) и деления (/). Операции принимают два операнда со следующими парами встроенных целочисленных типов данных:
int8, uint8
int16, uint16
int32, uint32
Открытие модели rtwdemo_crlmuldiv и используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
open_system('rtwdemo_crlmuldiv')

Этот пример определяет и регистрирует отображения замены кода для скалярных операций: сложение, вычитание, умножение, комплексное сопряжение, приведение, арифметический сдвиг вправо и арифметический сдвиг влево.
Поддерживаемые типы:
одиночный, двойной
int8, uint8
int16, uint16
int32, uint32
csingle, cdouble
cint8, cuint8
cint16, cuint16
cint32, cuint32
целые числа с фиксированной точкой
смешанные типы (различные типы на каждом входе)
Открытие модели rtwdemo_crlscalarops и используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
Дополнительные сведения о замене скалярного оператора см. в разделе Замена кода скалярного оператора.
Предполагается CBO, алгоритм по умолчанию для операций сложения и вычитания.
open_system('rtwdemo_crlscalarops')

В этом примере определяются и регистрируются сопоставления замены кода для матричных операций: сложение, вычитание, умножение, транспозиция, сопряжение и эрмитово.
Поддерживаемые типы:
single, double
int8, uint8
int16, uint16
int32, uint32
csingle, cdouble
cint8, cuint8
cint16, cuint16
cint32, cuint32
целые числа с фиксированной точкой
смешанные типы (различные типы на каждом входе)
Открытие модели rtwdemo_crlmatops, который показывает некоторые из этих замен. Используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
Дополнительные сведения о замене матричного оператора см. в разделе Замена кода Small Matrix Operation to Processor.
Предполагается CBO, алгоритм по умолчанию для операций сложения и вычитания.
open_system('rtwdemo_crlmatops')

В этом примере определяются и регистрируются сопоставления замены кода для подпрограмм основной линейной алгебры (BLAS). xGEMM и xGEMV. Можно сопоставить следующие операции подпрограмме BLAS:
Умножение матрицы
Матричное умножение с транспонированием на одном или обоих входах
Умножение матрицы с эрмитовой операцией на одном или обоих входах
Открытие модели rtwdemo_crlblas и используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
Дополнительные сведения о замене матричного умножения для BLAS см. в разделе Операция матричного умножения для замены кода BLAS MathWorks.
open_system('rtwdemo_crlblas')

В этом примере определяются и регистрируются сопоставления замены кода для операций скалярного сложения (+), вычитания (-), умножения (*) и деления (/). Операции принимают два операнда с фиксированными типами данных.
Замены кода можно определить как совпадающие:
Комбинация масштабирования наклона/смещения на входе и выходе
Комбинация двоичного масштабирования на входах и выходе
Относительное масштабирование между входами и выходом
Одинаковое значение наклона и нулевое чистое смещение на входе и выходе.
Открытие модели rtwdemo_crlfixpt и используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления библиотеки замены кода.
По умолчанию для замены кода оператора сложения и вычитания генератор кода предполагает, что замещающий код реализует алгоритм, созданный до операции (CBO).
Для использования в модели типов данных с фиксированной точкой требуется лицензия Fixed-Point Designer™.
Дополнительные сведения о замене кода оператора с фиксированной точкой см. в разделе Замена кода оператора с фиксированной точкой.
open_system('rtwdemo_crlfixpt')

В этом примере определяются и регистрируются сопоставления замены кода для пользовательских записей. Можно создать собственную запись путем подкласса из RTW.TflCFunctionEntryML или RTW.TflCOperationEntryML. Класс входа должен реализовывать do_match метод, который настраивает логику соответствия или изменяет соответствующую запись. do_match метод должен иметь фиксированную предварительно заданную подпись.
Открытие модели rtwdemo_crlcustomentry. Модель показывает, как изменить согласованную запись путем ввода констант в качестве дополнительных аргументов функции реализации. DTC1, Trigonometric Function, и Product show custom entry code replacement for:
Операция литья, демонстрирующая, как извлечь длины фракций из типов и передать их в функцию реализации - Out1 = custom_cast(In1, 2, 4).
Синус, демонстрирующий передачу постоянного значения функции реализации - Out2=custom_sin(In2, 1).
Операция умножения, демонстрирующая, как вычислить суммарный наклон операции и передать его в функцию реализации - Out3=custom_multiply_shift_right(In3,In4,3).
Используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления замены кода.
Дополнительные сведения о настраиваемых записях см. в разделе Настройка процесса сопоставления и замены.
open_system('rtwdemo_crlcustomentry')

В этом примере определяются и регистрируются сопоставления замены кода для функций MATLAB ®, указанных в блоке MATLAB Function. Функция может быть заменена путем указанияcoder.replace внутри него. Эта функция поддерживает замену функций MATLAB ® следующими:
Один или несколько входов
Один или несколько выходов
Скалярные и матричные входы и выходы
Открытие модели rtwdemo_crlcoderreplace. Модель показывает некоторые из этих требований. Поддерживаемые типы:
single, double
int8, uint8
int16, uint16
int32, uint32
csingle, cdouble
cint8, cuint8
cint16, cuint16
cint32, cuint32
Целые числа с фиксированной точкой
Смешанные типы (различные типы на каждом входе)
Используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления замены кода.
Для получения дополнительной информации о замене функции MATLAB ® см.coder.replace.
open_system('rtwdemo_crlcoderreplace')

В этом примере показано, как задать выравнивание операндов матрицы, передаваемых в функцию замещения. Некоторые реализации целевых функций требуют выравнивания данных для оптимизации производительности приложений. Чтобы настроить выравнивание данных для реализации функции:
Укажите требования к выравниванию данных в записи таблицы. Можно задать выравнивание для аргументов функции реализации по отдельности или совместно.
Укажите возможности выравнивания данных и синтаксис компилятора. Прикрепить AlignmentSpecification объект для TargetCharacteristics объект записи реестра, указанный в rtwTargetInfo.m файл.
Открытие модели rtwdemo_crlalign. В модели показаны три сценария замены кода выравнивания данных:
Add - Выравнивание экспортируемых и импортируемых сигналов. Можно указать точное значение для трассы в диалоговом окне «Свойства сигнала» или разрешить генератору кода определять наилучшую трассу на основе использования, оставив значение трассы равным -1.
Product - Согласование типов виртуальных и невиртуальных шин. Можно указать точное значение трассы для свойства «Трасса» объекта Simulink.Bus или разрешить генератору кода определять наилучшую трассу на основе использования, оставив свойству «Трасса» значение -1.
EML_MMUL - Выравнивание локальных переменных, глобальных переменных и параметров блоков.
Используйте кнопки в нижней части окна модели для просмотра файлов, определяющих и регистрирующих сопоставления замены кода. Обратите внимание, что модель настроена на использование компилятора GCC, Clang, MSVC или MinGW.
Дополнительные сведения об указании выравнивания данных для замены кода см. в разделе Выравнивание данных для замены кода.
open_system('rtwdemo_crlalign')

В этом примере показано средство просмотра замены кода. Средство просмотра замены кода можно использовать для:
Узнайте, какую библиотеку замены кода использовать
Проверка списка таблиц в библиотеке и записей в каждой таблице
Просмотр спецификаций ввода таблицы
Устранение неполадок при замене кода
Следующие команды открывают окно просмотра замены кода для таблицы замены кода crl_tablemuldiv:
crl = crl_table_muldiv; crviewer(crl); daRoot = DAStudio.Root; me = daRoot.find('-isa', 'DAStudio.Explorer');
Дополнительные сведения о средстве просмотра замены кода см. в разделе Проверка библиотеки замены кода.
Для каждой записи в таблице замены кода можно указать следующую информацию о построении для функций замены:
Зависимости заголовочных файлов
Зависимости исходных файлов
Дополнительные пути включения
Дополнительные пути к источнику
Дополнительные флаги ссылок
Кроме того, можно указать RTW.copyFileToBuildDir копирование заголовков, исходных файлов или файлов объектов, необходимых для создания кода замены, в папку сборки перед созданием кода. Можно указать RTW.copyFileToBuildDir установив его в качестве значения:
Собственность GenCallback в вызове для setTflCFunctionEntryParameters, setTflCOperationEntryParameters, или setTflCSemaphoreEntryParameters.
Аргумент genCallback в вызове для registerCFunctionEntry, registerCOperationEntry, или registerCSemaphoreEntry.
Примечание.Модели в этом примере конфигурируются для генерации кода только потому, что реализации для функций замены не предоставляются.
Дополнительные сведения об указании сведений о построении см. в разделе Указание сведений о построении в разделе Определение оптимизации библиотеки замены кода.
Каждое имя реализации функции, определенное записью таблицы замены кода, зарезервировано как уникальный идентификатор. Можно указать другие идентификаторы с таблицей для каждого файла заголовка. Предоставление дополнительных зарезервированных идентификаторов может помочь предотвратить дублирование символов и другие связанные с идентификаторами проблемы компиляции и связи.
Дополнительные сведения об указании зарезервированных идентификаторов см. в разделе Зарезервированные идентификаторы и замена кода.
По завершении использования моделей примеров удалите библиотеки замены кода примеров и закройте модели примеров с помощью следующих команд:
rmpath(fullfile(matlabroot,'toolbox','rtw','rtwdemos','crl_demo')); sl_refresh_customizations; close_system('rtwdemo_crladdsub', 0) close_system('rtwdemo_crl_cbo_cao', 0) close_system('rtwdemo_crlmuldiv', 0) close_system('rtwdemo_crlfixpt', 0) close_system('rtwdemo_crlmath', 0) close_system('rtwdemo_crlmatops', 0) close_system('rtwdemo_crlblas', 0) close_system('rtwdemo_crlscalarops', 0) close_system('rtwdemo_crlcustomentry', 0) close_system('rtwdemo_crlcoderreplace', 0) close_system('rtwdemo_crlalign', 0) drawnow; if exist('h','var') && ishghandle(h) close(h); end if ~isempty(me) me(end).delete; end clear h; clear me; clear isDaDemoSupported; clear crl; rtwdemoclean;