Разрабатывайте и используйте библиотеки замены кода для замены функции и операторов в сгенерированном коде. Замена кода является методом, чтобы изменить код, который генерирует генератор кода для функций и операторов, чтобы соответствовать требованиям кода приложения. Для примера можно заменить сгенерированный код, чтобы соответствовать таким требованиям, как:
Оптимизация для определенного окружения во время выполнения, включая, но не ограничиваясь этим, конкретный целевой компьютер
Интегрирование с существующим кодом приложения
Податливость стандарту, такому как AUTOSAR
Изменение поведения кода, такое как включение или отключение нефинитной или встроенной поддержки
Требования к коду конкретного применения или проекта, такие как использование BLAS или исключение math.h
, файлы системных заголовков или вызовы memcpy
или memset
.
Можно сконфигурировать генератор кода, чтобы использовать библиотеку замены кода, которую предоставляет MathWorks ®. Если у вас есть лицензия Embedded Coder ®, вы можете разрабатывать собственную библиотеку замещения кода в интерактивном режиме с помощью Code Replacement Tool или программно.
Этот пример предоставляет код MATLAB ®, который показывает различные способы, которыми можно задать отображения замещения кода. С каждым примером функции MATLAB ®, пример предоставляет файлы MATLAB ®, которые иллюстрируют, как разработать замену кода функции и оператора программно.
Дополнительные требования:
MATLAB CODER
Embedded Coder
Fixed-Point Designer
Для получения дополнительной информации смотрите Что такое индивидуальная настройка замещения кода? и создайте библиотеку замещения кода.
Следующий код создает подпапку в текущей рабочей папке (pwd). Новая папка содержит файлы, релевантные для этого примера.
currentDir = pwd;
[~,cgDir] = rtwdemodir();
coderdemo_setup('coderdemo_crl');
Идентифицируйте свои требования к замене кода в отношении функций или операционных отображений, информации о сборке и регистрационной информации.
Подготовьтесь к разработке библиотеки замещения кода (для примера, идентификации или разработки моделей для тестирования вашей библиотеки).
Задайте отображения замещения кода.
Укажите сведения о сборке для кода замены.
Регистрируйте отображения замещения кода.
Проверьте замену кода.
Разверните библиотеку.
Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода».
Этот пример определяет и регистрирует отображения замещения кода для математических функций. Можно задать отображения замещения кода для различных функций. Для получения дополнительной информации смотрите Код, который можно заменить из Кода MATLAB.
1. Откройте и исследуйте файл MATLAB ® для этого примера .
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_math_fcns.m'))
2. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода Function Replacement Examples.
RTW.TargetRegistry.getInstance('reset'); cfg = coder.config('lib','ecoder',true); cfg.CodeReplacementLibrary = 'Function Replacement Examples'; cfg.GenerateReport = false; cfg.LaunchReport = false;
3. Настройте параметры конфигурации, чтобы создать и определить тип входного параметра функции.
t = single(2);
4. Исследуйте файл определения таблицы замещения кода.
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_functions.m'))
5. Скомпилируйте программу MATLAB ® в исходный файл C с помощью параметров конфигурации, которые указывают на библиотеку замены кода и пример входного класса, заданный в шаге 3 как входные параметры для codegen
команда.
codegen('replace_math_fcns', '-config', cfg, '-args', {t, t});
Code generation successful.
6. Откройте файл replace_math_fcns.c
и исследуйте сгенерированный исходный код.
open(fullfile('codegen','lib','replace_math_fcns','replace_math_fcns.c'))
7. Закройте replace_math_fcns.m
.
Для получения дополнительной информации о замене математической функции, см. Math Function Code Replacement.
В этом примере показано, как задать и зарегистрировать отображения замещения кода для операций сложения (+) и вычитания (-). При определении записей для операций сложения и вычитания можно задать, какой из следующих алгоритмов (EntryInfoAlgorithm
) ваши библиотечные функции реализуют:
Приведение в действие (CBO) (RTW_CAST_BEFORE_OP
), значение по умолчанию
Приведение в действие (CAO) (RTW_CAST_AFTER_OP
)
1. Откройте и исследуйте файл MATLAB ® для этого примера .
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','addsub_two_int16.m')) % % CBO, the default algorithm, is assumed.
2. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода Примеры сложения и вычитания.
RTW.TargetRegistry.getInstance('reset'); cfg = coder.config('lib','ecoder',true); cfg.CodeReplacementLibrary = 'Addition & Subtraction Examples'; cfg.GenerateReport = false; cfg.LaunchReport = false;
3. Настройте параметры конфигурации, чтобы создать и определить тип входа операции.
t = int16(2);
4. Исследуйте файл определения таблицы замещения кода.
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_addsub.m'))
5. Скомпилируйте программу MATLAB ® в исходный файл C с помощью параметров конфигурации, которые указывают на требуемую библиотеку замены кода и пример входного класса, заданный в шаге 3 как входные параметры для codegen
команда.
codegen('addsub_two_int16','-config', cfg, '-args', {t, t});
Code generation successful.
6. Откройте файл addsub_two_int16.c
и исследуйте сгенерированный исходный код.
open(fullfile('codegen','lib','addsub_two_int16','addsub_two_int16.c'))
7. Закройте addsub_two_int16.m
.
Для получения дополнительной информации о замене оператора сложения и вычитания см. раздел Замена кода оператора Скаляра и Замена кода оператора вычитания и Замена кода оператора Скаляра.
Этот пример задает и регистрирует отображения замещения кода для матричных операций: сложение, вычитание, умножение, транспозиция, сопряженный и Эрмитов.
Поддерживаемые типы включают:
single
, double
int8
, uint8
int16
, uint16
int32
, uint32
csingle
, cdouble
cint8
, cuint8
cint16
, cuint16
cint32
, cuint32
целые числа с фиксированной точкой
смешанные типы (различные типы на каждом входе)
1. Откройте и исследуйте файл MATLAB ® для этого примера :
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_matrix_ops.m'))
2. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода Matrix Op Replacement Examples.
RTW.TargetRegistry.getInstance('reset'); cfg = coder.config('lib','ecoder',true); cfg.CodeReplacementLibrary = 'Matrix Op Replacement Examples'; cfg.GenerateReport = false; cfg.LaunchReport = false;
3. Настройте параметры конфигурации, чтобы создать и определить тип входа операции.
t = [1.0 2.0; 3.0, 4.0];
4. Исследуйте файл определения таблицы замещения кода.
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_matops.m'))
5. Скомпилируйте программу MATLAB ® с помощью параметров конфигурации, которые указывают на требуемую библиотеку замещения кода и пример входного класса, заданный в шаге 3 как входные параметры для codegen
команда.
codegen('replace_matrix_ops', '-config', cfg, '-args', {t, t});
Code generation successful.
6. Откройте файл replace_matrix_ops.c
и исследуйте сгенерированный исходный код.
open(fullfile('codegen','lib','replace_matrix_ops','replace_matrix_ops.c'))
7. Закройте replace_matrix_ops.m
.
Для получения дополнительной информации о замене матричного оператора, смотрите Small Matrix Operation to Processor Code Replacement.
Этот пример определяет и регистрирует преобразования замещения кода для подпрограмм Основной Линейной Алгебры (BLAS) xGEMM
и xGEMV
. Можно сопоставить следующие операции с стандартной подпрограммой BLAS:
Матричное умножение
Матричное умножение с транспонированием на одном или обоих входах
Матричное умножение с Эрмитовой операцией на одном или обоих входах
1. Откройте и исследуйте файл MATLAB ® для этого примера .
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','replace_matrix_ops_blas.m'))
2. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода BLAS Replacement Examples.
RTW.TargetRegistry.getInstance('reset'); cfg = coder.config('lib','ecoder',true); cfg.CodeReplacementLibrary = 'BLAS Replacement Examples'; cfg.GenerateReport = false; cfg.LaunchReport = false;
3. Настройте параметры конфигурации, чтобы создать и определить тип входного параметра функции.
t = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0];
4. Исследуйте файл определения таблицы замещения кода.
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_blas.m'))
5. Скомпилируйте программу MATLAB ® с помощью параметров конфигурации, которые указывают на требуемую библиотеку замещения кода и пример входного класса, заданный в шаге 3 как входные параметры для codegen
команда.
codegen('replace_matrix_ops_blas', '-config', cfg, '-args', {t, t});
Code generation successful.
6. Откройте файл replace_matrix_ops_blas.c
и исследуйте сгенерированный исходный код.
open(fullfile('codegen','lib','replace_matrix_ops_blas','replace_matrix_ops_blas.c'))
7. Закройте replace_matrix_ops_blas.m
.
Для получения дополнительной информации о замене матричного умножения для BLAS, смотрите Операцию матричного умножения к замене кода BLAS MathWorks.
Библиотеки замены кода поддерживают замену функций MATLAB ® скалярными и матричными входами и выходами для встроенных, сложных и типов данных с фиксированной точкой.
1. Откройте и исследуйте файл MATLAB ® для этого примера .
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','coder_replace_fcn.m'))
2. Сконфигурируйте генератор кода, чтобы использовать библиотеку замещения кода Coder Replace Examples.
RTW.TargetRegistry.getInstance('reset'); cfg = coder.config('lib','ecoder',true); cfg.CodeReplacementLibrary = 'Coder Replace Examples'; cfg.GenerateReport = false; cfg.LaunchReport = false;
3. Настройте параметры конфигурации, чтобы создать и определить тип входного параметра функции.
t = [1 2; 3 4];
4. Исследуйте файл определения таблицы замещения кода.
edit(fullfile(matlabroot,'toolbox','coder','codegendemos','coderdemo_crl','crl_table_coder_replace.m'))
5. Скомпилируйте программу MATLAB ® с помощью параметров конфигурации, которые указывают на требуемую библиотеку замещения кода и пример входного класса, заданный в шаге 3 как входные параметры для codegen
команда.
codegen('coder_replace_fcn', '-config', cfg, '-args', {t, t});
Code generation successful.
6. Откройте файл coder_replace_fcn.c
и исследуйте сгенерированный исходный код.
open(fullfile('codegen','lib','coder_replace_fcn','coder_replace_fcn.c'))
7. Закройте coder_replace_fcn.m
.
Для получения дополнительной информации см. раздел docid:ecoder_ug.mw_ab7cd3a5-076f-40e4-b8a9-d3357993c100.
Для каждой записи в таблице замещения кода можно задать следующую информацию о сборке для функций замены:
Зависимости заголовочного файла
Зависимости исходного файла
Дополнительные пути
Дополнительные исходные пути
Дополнительные флаги ссылки
Кроме того, можно задать RTW.copyFileToBuildDir
копировать заголовки, исходные файлы или файлы объектов, которые требуются для генерации кода замены, в папку сборки перед генерацией кода. Можно задать RTW.copyFileToBuildDir
путем установки его как значения:
Свойства GenCallback
в вызове setTflCFunctionEntryParameters
, setTflCOperationEntryParameters
, или setTflCSemaphoreEntryParameters
.
Аргументы в genCallback
в вызове registerCFunctionEntry
, registerCOperationEntry
, или registerCSemaphoreEntry
.
Примечание: Модели в этом примере сконфигурированы для генерации кода только потому, что реализации для функций замены не предусмотрены.
Дополнительные сведения об указании сведений о сборке для кода замены см. в разделе Разработка библиотеки замещения кода.
Удалите файлы и вернитесь в исходную папку
RTW.TargetRegistry.getInstance('reset'); rtwdemoclean; clear coderdemo_crl cd ../