Разрабатывайте и используйте библиотеки замены кода для замены функции и операторов в сгенерированном коде. Замена кода является методом, чтобы изменить код, который генерирует генератор кода для функций и операторов, чтобы соответствовать требованиям кода приложения. Для примера можно заменить сгенерированный код, чтобы соответствовать таким требованиям, как:
Оптимизация для определенного окружения во время выполнения, включая, но не ограничиваясь этим, конкретный целевой компьютер
Интегрирование с существующим кодом приложения
Податливость стандарту, такому как AUTOSAR
Изменение поведения кода, такое как включение или отключение нефинитной или встроенной поддержки
Требования к коду конкретного применения или проекта, такие как использование BLAS или исключение math.h
, файлы системных заголовков или вызовы memcpy
или memset
.
Можно сконфигурировать модель таким образом, чтобы генератор кода использовал библиотеку замены кода, которую предоставляет MathWorks ®. Если у вас есть лицензия Embedded Coder ®, вы можете разрабатывать собственную библиотеку замещения кода в интерактивном режиме с помощью Code Replacement Tool или программно.
Этот пример использует модели, чтобы показать различные способы программного определения отображений замены кода. Каждая модель включает кнопки, которые можно использовать для
Просмотрите определения библиотечных таблиц замещения кода из Code Replacement Viewer
Откройте файл определения таблицы библиотек в редакторе
Откройте файл регистрации библиотеки в редакторе
Просмотр строения модели
Сгенерируйте код
Для получения дополнительной информации смотрите Задать Оптимизацию Библиотеки Замещения Кода и Библиотеку Замены Кода Регистра.
Идентифицируйте свои требования к замене кода в отношении функций или операционных отображений, информации о сборке и регистрационной информации.
Подготовьтесь к разработке библиотеки замещения кода (для примера, идентификации или разработки моделей для тестирования вашей библиотеки).
Задайте отображения замещения кода.
Укажите сведения о сборке для кода замены.
Регистрируйте отображения замещения кода.
Проверьте замену кода.
Разверните библиотеку.
Для получения дополнительной информации смотрите Quick Start Code Replacement Library Development - Simulink ®.
Этот пример определяет и регистрирует отображения замещения кода для математических функций. Можно задать отображения замещения кода для различных функций (см. «Код, который можно заменить из моделей Simulink»).
Откройте модель rtwdemo_crlmath
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые определяют и регистрируют отображения библиотеки замены кода.
Для получения дополнительной информации см. «Замена кода математической функции».
open_system('rtwdemo_crlmath')
В этом примере показано, как задать и зарегистрировать отображения замещения кода для операций сложения (+) и вычитания (-). При определении записей для операций сложения и вычитания можно задать, какой из следующих алгоритмов (EntryInfoAlgorithm
) ваши библиотечные функции реализуют:
Приведение в действие (CBO) (RTW_CAST_BEFORE_OP
), значение по умолчанию
Приведение в действие (CAO) (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 Code Replacement.
CBO, алгоритм по умолчанию для операций сложения и вычитания, принят.
open_system('rtwdemo_crlmatops')
Этот пример определяет и регистрирует преобразования замещения кода для подпрограмм Основной Линейной Алгебры (BLAS) xGEMM
и xGEMV
. Можно сопоставить следующие операции с стандартной подпрограммой BLAS:
Матричное умножение
Матричное умножение с транспонированием на одном или обоих входах
Матричное умножение с Эрмитовой операцией на одном или обоих входах
Откройте модель rtwdemo_crlblas
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые определяют и регистрируют отображения библиотеки замены кода.
Для получения дополнительной информации о замене матричного умножения для BLAS, смотрите Операцию матричного умножения к замене кода BLAS MathWorks.
open_system('rtwdemo_crlblas')
Этот пример задает и регистрирует отображения замещения кода для операций скалярного сложения (+), вычитания (-), умножения (*) и деления (/). Операции берут два операнда с типами данных с фиксированной точкой.
Можно задать замену кода как соответствующую:
Комбинация масштабирования наклона/смещения на входах и выходе
Комбинация масштабирования с двоичной точкой на входах и выходе
Относительное масштабирование между входами и выходом
То же значение наклона и нулевое смещение сети на входах и выходе.
Откройте модель rtwdemo_crlfixpt
и используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые определяют и регистрируют отображения библиотеки замены кода.
По умолчанию для замены кода оператора сложения и вычитания генератор кода принимает, что код замены реализует алгоритм cast-before-operation (CBO).
Для использования типов данных с фиксированной точкой в модели требуется лицензия Fixed-Point Designer™.
Для получения дополнительной информации о замене кода оператора с фиксированной точкой смотрите Замена кода оператора с фиксированной точкой.
open_system('rtwdemo_crlfixpt')
Этот пример определяет и регистрирует отображения замещения кода для пользовательских записей. Вы можете создать свою собственную запись путем подклассирования из RTW.TflCFunctionEntryML
или RTW.TflCOperationEntryML
. Ваш класс входа должен реализовать do_match
метод, который настраивает соответствующую логику или изменяет соответствующую запись. The do_match
метод должен иметь фиксированную предустановленную сигнатуру.
Откройте модель rtwdemo_crlcustomentry
. Модель показывает, как изменить совпадающую запись, введя константы в качестве дополнительных аргументов функции реализации. DTC1
, Trigonometric Function
, и Product
показать пользовательскую замену кода входа для:
Операция приведения, которая демонстрирует, как извлечь длины дробей из типов и передать их в функцию реализации - 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
- Выравнивание типов виртуальных и невиртуальных шин. Можно задать точное значение трассы для свойства Alignment объекта Simulink.Bus или разрешить генератору кода определять лучшую трассу на основе использования, оставив значение свойства Alignment равным -1.
EML_MMUL
- Выравнивание локальных переменных, глобальных переменных и параметров блоков.
Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые определяют и регистрируют отображения замены кода. Обратите внимание, что модель сконфигурирована для использования компилятора GCC, Clang, MSVC или MinGW.
Дополнительные сведения об указании выравнивания данных для замены кода см. в разделе Выравнивание данных для замены кода.
open_system('rtwdemo_crlalign')
Этот пример показывает Code Replacement Viewer. Средство просмотра замещения кода можно использовать для:
Исследуйте, какую библиотеку замещения кода использовать
Проверьте список таблиц в библиотеке и записи в каждой таблице
Проверьте спецификации записи таблицы
Диагностируйте ошибки при замене кода
Следующие команды открывают Code Replacement Viewer для таблицы замещения кода 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;