Разработка и использование библиотек замены кода для замены функции и операторов в сгенерированном коде. Замена кода - это метод изменения кода, создаваемого генератором кода для функций и операторов в соответствии с требованиями прикладного кода. Например, можно заменить созданный код в соответствии со следующими требованиями:
Оптимизация для конкретной среды выполнения, включая, но не ограничиваясь этим, конкретное целевое оборудование
Интеграция с существующим кодом приложения
Соответствие стандарту, например AUTOSAR
Изменение поведения кода, например, включение или отключение поддержки non finite или inline
Требования к прикладным или проектным кодам, такие как использование BLAS или исключение math.h, системные заголовочные файлы или вызовы memcpy или memset.
Можно настроить генератор кода на использование библиотеки замены кода, предоставляемой MathWorks ®. Если у вас есть лицензия Embedded Coder ®, вы можете разработать собственную библиотеку замены кода в интерактивном режиме с помощью средства замены кода или программным способом.
В этом примере представлен код MATLAB ®, показывающий различные способы определения сопоставлений замены кода. В каждом примере функции MATLAB ® в примере представлены файлы MATLAB ®, иллюстрирующие программную разработку замены функций и кода оператора.
Дополнительные требования:
Кодер MATLAB
Встроенный кодер
Конструктор фиксированных точек
Дополнительные сведения см. в разделе Что такое настройка замены кода? и разработка библиотеки для замены кода.
Следующий код создает вложенную папку в текущей рабочей папке (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. Настройте генератор кода для использования библиотеки замены кода Примеры замены функции.
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.
Дополнительные сведения о замене математической функции см. в разделе Замена кода математической функции.
В этом примере показано, как определить и зарегистрировать сопоставления замены кода для операций сложения (+) и вычитания (-). При определении записей для операций сложения и вычитания можно указать, какой из следующих алгоритмов (EntryInfoAlgorithm) функции библиотеки реализуют:
Литой перед работой (КБО) (RTW_CAST_BEFORE_OP), значение по умолчанию
Литой после эксплуатации (САО) (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.
В этом примере определяются и регистрируются сопоставления замены кода для подпрограмм основной линейной алгебры (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. Настройте генератор кода, чтобы использовать примеры замены кодера библиотеки замены кода.
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 ../