После того, как вы подготовитесь к разработке библиотеки, используйте свои требования, чтобы задать заменяющие отображения кода. Заменяющее отображение кода сопоставляет концептуальное представление функции или оператора, который знаком генератору кода с представлением пользовательской реализации, которое задает C или заменяющего прототипа функции C++. Вы получаете отображение как запись в заменяющей таблице кода:
В интерактивном режиме, при помощи Заменяющего Инструмента Кода.
Программно, при помощи интерфейса программирования MATLAB®.
В следующей таблице перечислены ситуации, чтобы помочь вам решить, когда использовать интерактивный или программируемый подход.
Ситуация | Подход |
---|---|
Определение отображений впервые. | Заменяющий инструмент кода. |
Отображения быстрого прототипирования. | Заменяющий Инструмент кода, чтобы быстро сгенерировать, укажите и протестируйте отображения. |
Разработка отображения как шаблон или отправная точка для определения подобных отображений. | Заменяющий Инструмент кода, чтобы сгенерировать код определения, который можно скопировать и изменить. |
Изменение регистрационного файла, включая копирование и вставку содержимого. | Редактор MATLAB, чтобы обновить интерфейс программирования непосредственно. |
Задавая отображения, которые задают атрибуты, не доступные от Заменяющего Инструмента Кода (например, наборы параметров алгоритма). | Интерфейс программирования. |
Многократное использование существующего кода для новых отображений путем копирования, вставляя и редактируя существующие отображения. | Интерфейс программирования. |
Этот пример показывает, как использовать Заменяющий Инструмент Кода, чтобы разработать заменяющие отображения кода. Инструмент идеален для начала работы с разработкой отображений, быстрого прототипирования и разработки отображения, чтобы использовать в качестве отправной точки для определения подобных отображений.
Откройте заменяющий инструмент кода
Выполнить одно из следующих действий:
В Командном окне введите команду crtool
.
В диалоговом окне Configuration Parameters перейдите к панели Code Generation. В разделе Advanced parameters прокрутите вниз и нажмите кнопку Custom CRL....
Лицензия Embedded Coder® не требуется, чтобы создавать заменяющую библиотеку пользовательского кода. Однако у вас должна быть лицензия Embedded Coder, чтобы пользоваться такой библиотекой.
По умолчанию, отображения инструмента, слева направо, корневая панель, панель списка и диалоговая панель. Можно управлять отображением:
Перетащите контуры, чтобы расширить, сузить, сократить, или удлинить панели и изменить размер столбцов таблицы.
Выберите View> Show dialog pane, чтобы скрыть или отобразить самую правую панель.
Кликните по столбцу таблицы, направляющемуся, чтобы отсортировать таблицу на основе содержимого выбранного столбца.
Щелкните правой кнопкой по заголовку столбца таблицы и выберите Hide, чтобы удалить столбец из отображения. (Вы не можете скрыть столбец Name.)
Составьте заменяющую таблицу кода
В окне Code Replacement Tool выберите File> New table.
На правой панели назовите таблицу и нажмите Apply. Позже, когда вы сохранили таблицу, инструмент использует имя таблицы, которое вы задаете, чтобы назвать файл. Например, если вы вводите имя my_sinfcn
, инструмент называет файл my_sinfcn.m
.
Создайте записи таблицы
Создайте одну или несколько записей таблицы. Каждая запись сопоставляет концептуальное представление функции или оператора к вашему представлению реализации. Информация, которую вы вводите, зависит от типа записи, которую вы создаете. Введите следующую информацию:
На левой панели выберите таблицу, в которую вы хотите добавить запись.
Выберите File> New entry> entry-type, где entry-type является одним из:
Математическая операция
Функция
Операция BLAS
Операция CBLAS
Сетевая наклонная операция фиксированной точки
Семафорная запись
Запись индивидуальной настройки
Новая запись появляется в средней панели, первоначально без имени.
В средней панели выберите новую запись.
На правой панели, на вкладке Mapping Information, из меню Function или Operation, выбирают функцию или операцию, которую вы хотите, чтобы генератор кода заменил. Независимо от типа записи сделайте выбор из этого меню. Ваш выбор определяет то, что другую информацию вы задаете.
За исключением записей индивидуальной настройки, вы также указываете информацию для своего заменяющего прототипа функции. Можно также задать атрибуты реализации, такие как округляющиеся режимы, чтобы применяться.
При появлении соответствующего запроса укажите дополнительную информацию записи, которую вы хотите, чтобы генератор кода использовал при поиске соответствия. Например, когда вы выбираете операцию сложения или операцию вычитания, инструмент предлагает вам задавать алгоритм (Cast before operation
или Cast after operation
).
Рассмотрите концептуальную информацию об аргументе, которую инструмент заполняет для функции или операции. Концептуальные аргументы ввода и вывода представляют аргументы для функции или заменяемого оператора. Концептуальные аргументы наблюдают соглашения о присвоении имен ('y1'
, 'u1'
, 'u2'
...) и типы данных, знакомые генератору кода.
При проверке записи генератор кода подтверждает тот каждый концептуальный аргумент, имеет тип ввода-вывода, который совместим с именем аргумента. Например, вход должен иметь IOType
RTW_IO_INPUT
.
Если вы не хотите, чтобы типы данных для вашей реализации совпали с концептуальными типами аргумента, снимите флажок Make the conceptual and implementation argument types the same. Например, большинство ФУНКЦИЙ ANSI C работает с и возвращает данные double
. Снимите флажок, если хотят сопоставить концептуальное представление функции к представлению реализации, которое задает значение аргумента и возвращаемое значение. Например, снимите флажок, чтобы сопоставить концептуальное представление функционального sin
к представлению реализации, которое задает значение аргумента и возвращаемое значение типа single
(single sin(single)
) типа double
(double sin(double)
. В этом случае генератор кода производит следующий код:
y = (single) sin(u1);
Если вы выбираете Custom
для функциональной записи, указываете только концептуальную информацию аргумента.
Задайте имя и информацию об аргументе для вашей заменяющей функции. При вводе информацию и нажимаете Apply, инструмент обновляет Function signature preview.
При проверке записи генератор кода подтверждает тот каждый аргумент реализации, имеет тип ввода-вывода, который совместим с концептуальным аргументом, с которым это сопоставлено. Например, концептуальный аргумент типа RTW_IO_OUTPUT
требует совместимого аргумента реализации типа RTW_IO_OUTPUT
или RTW_IO_INPUT_OUTPUT
. Типом ввода-вывода по умолчанию является RTW_IO_INPUT
.
Задайте дополнительные атрибуты реализации, которые применяются. Например, в зависимости от типа и имени записи, которую вы задаете, инструмент предлагает вам задавать:
Целочисленный режим насыщения
Округление режимов
Позволить ли входные параметры, которые включают выражения
Изменяет ли функция внутреннее или глобальное состояние
Нажмите Apply.
Подтвердите таблицы и записи
Заменяющий Инструмент Кода обеспечивает способ подтвердить синтаксис заменяющих таблиц кода и записей таблицы, когда вы задаете их. Если инструмент находит ошибки валидации, можно обратиться к ним и повторить валидацию. Повторите процесс, пока инструмент не сообщит об ошибках.
К | Сделать |
---|---|
Подтвердите записи таблицы | Выберите запись, прокрутку к нижней части вкладки Mapping Information, и нажмите Validate entry. Также выберите одну или несколько записей, щелкните правой кнопкой и выберите Validate entries. |
Подтвердите таблицу | Выберите таблицу. Затем выберите Actions> Validate table. |
Сохраните таблицу
Когда вы сохранили таблицу, инструмент подтверждает неподтвержденное содержимое.
Выберите File> Save table.
В диалоговом окне Browse For Folder задайте местоположение и имя для файла. Как правило, вы выбираете местоположение на пути MATLAB. По умолчанию инструмент называет файл с помощью имени, которое вы задаете для таблицы с дополнительным .m
.
Нажмите Save.
Откройте и измените таблицы
После того, чтобы сохранить заменяющую таблицу кода, чтобы внести изменения в таблице:
Выберите File> Open table.
В диалоговом окне файла Импорта просмотрите к файлу MATLAB, который содержит таблицу.
Повторите последовательность, чтобы открыться и работать над несколькими таблицами.
Если вы открываете несколько таблиц, можно управлять таблицами вместе. Например, используйте инструмент для:
Создайте новые записи таблицы.
Удалите записи.
Скопируйте и вставьте или вырежьте и вставьте информацию между таблицами.
Этот пример показывает, как задать замену кода, сопоставляющую программно. Интерфейс программирования для определения заменяющих табличных отображений кода идеален для
Изменение таблиц, которые вы составляете с Заменяющим Инструментом Кода.
Определение отображений для специализированных записей, которые вы не можете создать с Заменяющим Инструментом Кода.
Тиражирование и изменение подобных записей и таблиц.
Шаги для определения отображения программно:
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hTable = crl_table_sinfcn()
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hTable = RTW.TflTable;
Для каждой функции или оператора, который вы хотите, чтобы генератор кода заменил, сопоставьте концептуальное представление функции или оператора к представлению реализации как запись таблицы.
В теле табличного файла определения создайте заменяющий объект записи кода. Вызовите одну из следующих функций.
Тип записи | Функция |
---|---|
Математическая операция | RTW.TflCOperationEntry |
Функция | RTW.TflCFunctionEntry |
Операция BLAS | RTW.TflBlasEntryGenerator |
Операция CBLAS | RTW.TflCBlasEntryGenerator |
Операции сложения фиксированной точки и операции вычитания (поддерживают для SlopesMustBeTheSame и параметров MustHaveZeroNetBias ), | RTW.TflCOperationEntryGenerator |
Сетевая наклонная операция фиксированной точки | RTW.TflCOperationEntryGenerator_NetSlope |
Семафор или взаимоисключающая запись | RTW.TflCSemaphoreEntry |
Пользовательская функциональная запись | (где является классом, выведенным от RTW.TflCFunctionEntryML ), |
Пользовательская запись операции | (где является классом, выведенным от RTW.TflCOperationEntryML ), |
Например:
hEnt = RTW.TflCFunctionEntry;
Можно объединить шаги создания записи, установки параметров записи, концептуального создания и аргументы реализации и добавление записи в таблицу с одним вызовом функции к registerCFunctionEntry
, registerCPPFunctionEntry
или registerCPromotableMacroEntry
, если вы создаете запись для функции, и реализация функции соответствует следующим критериям:
Имена аргумента реализации и порядок совпадают с именами и порядком соответствующих концептуальных аргументов.
Входные параметры имеют тот же тип.
Возврат и имена входного параметра следуют соглашениям о присвоении имен генератора кода по умолчанию:
Возвращаемым аргументом является y1
.
Входными параметрами является u1
, u2
...,
.un
Например:
registerCFunctionEntry(hTable, 100, 1, 'sin', 'double', ... 'sin_dbl', 'double', 'sin_dbl.h','','');
Как другая альтернатива, можно значительно уменьшать объем кода, который вы пишете путем объединения шагов создания записи и концептуальный и аргументы реализации с вызовом функции createCRLEntry
. В этом случае укажите концептуальную информацию и информацию о реализации как вектор символов или представьте скалярные спецификации в виде строки.
Например:
hEnt = createCRLEntry(hTable, ... 'double y1 = sin(double u1)', ... 'mySin');
Этот подход не поддерживает:
Реализации C++
Выравнивание данных
Замена оператора с сетевыми наклонными аргументами
Спецификации параметра записи (например, приоритет, алгоритм, создавая информацию)
Семафор и взаимоисключающие замены функции
Установите параметры записи, такие как приоритет, информация об алгоритме и реализация (замена) имя функции. Вызовите функцию, перечисленную в следующей таблице для типа записи, который вы создали.
Тип записи | Функция |
---|---|
Математическая операция | setTflCOperationEntryParameters |
Функция | setTflCFunctionEntryParameters |
Операция BLAS | setTflCOperationEntryParameters |
Операция CBLAS | setTflCOperationEntryParameters |
Операции сложения фиксированной точки и операции вычитания, где существует отображение many-one, такое как отображение для области значений фиксированных точек к той же заменяющей функции (поддержка SlopesMustBeTheSame и параметров MustHaveZeroNetBias ) | setTflCOperationEntryParameters |
Сетевая наклонная операция фиксированной точки | setTflCOperationEntryParameters |
Семафор или взаимоисключающая запись | setTflCSemaphoreEntryParameters |
Пользовательская функциональная запись | setTflCFunctionEntryParameters |
Пользовательская запись операции | setTflCOperationEntryParameters |
Чтобы видеть список параметров, которые можно установить в командной строке, создают новую запись и не используют точку с запятой в конце команды. Например:
hEnt = RTW.TflCFunctionEntry
hEnt = TflCFunctionEntry with properties: Implementation: [1x1 RTW.CImplementation] SlopesMustBeTheSame: 0 BiasMustBeTheSame: 0 AlgorithmParams: [] ImplType: 'FCN_IMPL_FUNCT' AdditionalHeaderFiles: {0x1 cell} AdditionalSourceFiles: {0x1 cell} AdditionalIncludePaths: {0x1 cell} AdditionalSourcePaths: {0x1 cell} AdditionalLinkObjs: {0x1 cell} AdditionalLinkObjsPaths: {0x1 cell} AdditionalLinkFlags: {0x1 cell} AdditionalCompileFlags: {0x1 cell} SearchPaths: {0x1 cell} Key: '' Priority: 100 ArrayLayout: 'COLUMN_MAJOR' ConceptualArgs: [0x1 handle] EntryInfo: [] GenCallback: '' GenFileName: '' SaturationMode: 'RTW_SATURATE_UNSPECIFIED' RoundingModes: {'RTW_ROUND_UNSPECIFIED'} TypeConversionMode: 'RTW_EXPLICIT_CONVERSION' AcceptExprInput: 1 SideEffects: 0 UsageCount: 0 RecordedUsageCount: 0 Description: '' StoreFcnReturnInLocalVar: 0 AllowShapeAgnosticMatch: 0 TraceManager: [1x1 RTW.TflTraceManager]
Видеть параметры реализации, введите:
hEnt.Implementation
ans = CImplementation with properties: HeaderFile: '' SourceFile: '' HeaderPath: '' SourcePath: '' Return: [] StructFieldMap: [] Name: '' Arguments: [0x1 RTW.Argument] ArgumentDescriptor: []
Например, чтобы установить параметры записи для sin
функционируют и называют вашу заменяющую функцию sin_dbl
, используют следующий вызов функции:
setTflCFunctionEntryParameters(hEnt, ... 'Key', 'sin', ... 'ImplementationName', 'sin_dbl');
Создайте концептуальные аргументы и добавьте их в массив записи концептуальных аргументов.
Задайте выходные аргументы перед входными параметрами.
Задайте имена аргумента, которые выполняют соглашения о присвоении имен аргумента генератора кода:
y1
для возвращаемого аргумента
u1
, u2
...,
для входных параметров un
Задайте типы данных, которые знакомы генератору кода.
Функциональная подпись, включая именование аргумента, порядок, и атрибуты, должна выполнить соответствие подписи, разыскиваемое вызывающими сторонами оператора или функцией.
Генератор кода определяет размер значения для аргумента с неразмерным типом, таким как целое число, на основе параметров конфигурации аппаратной реализации.
Для каждого аргумента:
Идентифицируйте, является ли аргумент для ввода или вывода, имени и типа данных. Если вы не знаете, что аргументы задать для поддерживаемой функции или операции, используйте Заменяющий Инструмент Кода, чтобы найти их. Например, чтобы найти концептуальные аргументы для функции sin
, откройте инструмент, составьте таблицу, создайте функциональную запись, и в Function меню выбирает sin
.
При проверке записи генератор кода подтверждает тот каждый концептуальный аргумент, имеет тип ввода-вывода, который совместим с именем аргумента. Например, вход должен иметь IOType
RTW_IO_INPUT
.
Создайте и добавьте концептуальный аргумент в запись. Можно выбрать метод из методов, перечисленных в этой таблице.
Если | Затем |
---|---|
Вы хотите более простой код или хотите явным образом задать, является ли аргумент скаляром или нескалярный (вектор или матрица). | Вызовите функциональный createAndAddConceptualArg(hEnt, ... 'RTW.TflArgNumeric', ... 'Name', 'y1',... 'IOType', 'RTW_IO_OUTPUT',... 'DataTypeMode', 'double'); Второй аргумент задает, является ли аргумент скаляром ( |
Вы хотите создать аргумент на основе встроенного определения аргумента (например, скаляр или нескалярный). | Вызовите arg = getTflArgFromString(hEnt, 'y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(hEnt, arg); |
Необходимо задать несколько подобных отображений, вы хотите минимизировать код, чтобы записать, и записи не требуют выравнивания данных, используют сетевые наклонные аргументы или включают взаимоисключающие замены или семафор. | Вызовите hEnt = createCRLEntry(hTable, ... 'double y1 = sin(double u1)', ... 'mySin'); |
Следующий код показывает второй подход, перечисленный в таблице для определения концептуального выходного аргумента и определений входного параметра для функции sin
.
% Conceptual Args arg = getTflArgFromString(hEnt, 'y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(hEnt, arg); arg = getTflArgFromString(hEnt, 'u1','double'); addConceptualArg(hEnt, arg);
Создайте аргументы реализации для C, или замена C++ функционируют и добавляют их в запись.
Когда заменяющий код, генератор кода использует имена аргумента, чтобы определить, как это передает данные функции реализации.
Для функциональных замен порядок имен аргумента реализации должен совпадать с порядком концептуальных имен аргумента.
Для замен оператора порядок имен аргумента реализации не должен совпадать с порядком концептуальных имен аргумента. Например, для замены оператора для сложения, y1=u1+u2
, концептуальными аргументами является y1
, u1
и u2
, в том порядке. Если подписью вашей функции реализации является t myAdd(t u2, t u1)
, где t
является допустимым типом C, на основе соответствий имени аргумента, генератор кода передает значение первого концептуального аргумента, u1
, к второму аргументу реализации myAdd
. Генератор кода передает значение второго концептуального аргумента, u2
, к первому аргументу реализации myAdd
.
Для замен оператора можно повторно сопоставить выходные аргументы оператора входным аргументам функции реализации.
Для каждого аргумента:
Идентифицируйте, является ли аргумент для ввода или вывода, имени и типа данных.
При проверке записи генератор кода подтверждает тот каждый аргумент реализации, имеет тип ввода-вывода, который совместим с концептуальным аргументом, с которым это сопоставлено. Например, концептуальный аргумент типа RTW_IO_OUTPUT
требует совместимого аргумента реализации типа RTW_IO_OUTPUT
или RTW_IO_INPUT_OUTPUT
. Типом ввода-вывода по умолчанию является RTW_IO_INPUT
.
Создайте и добавьте аргумент реализации в запись. Можно выбрать метод из методов, перечисленных в этой таблице.
Если | Затем |
---|---|
Вы хотите заполнить аргументы реализации как копии ранее созданных соответствующих концептуальных аргументов | Вызовите функциональный copyConceptualArgsToImplementation(hEnt); |
Вы хотите создать и добавить аргументы реализации индивидуально или отличаться атрибуты аргумента, при поддержании концептуального порядка аргументов | Вызовите функции createAndSetCImplementationReturn(hEnt, 'RTW.TflArgNumeric', ... 'Name', 'y1', ... 'IOType', 'RTW_IO_OUTPUT', ... 'IsSigned', true, ... 'WordLength', 32, ... 'FractionLength', 0); createAndAddImplementationArg(op_entry, 'RTW.TflArgNumeric',... 'Name', 'u1', ... 'IOType', 'RTW_IO_INPUT',... 'IsSigned', true,... 'WordLength', 32, ... 'FractionLength', 0 ); |
Вы хотите минимизировать объем кода или задать аргументы константы, чтобы передать функции реализации | Создайте аргумент с вызовом функционального arg = getTflArgFromString(hEnt,... 'y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setReturn(arg); arg = getTflArgFromString(hEnt,... 'u1','double'); hEnt.Implementation.addArgument(arg); Следующий вызов arg = getTflArgFromString(hEnt,... 'u2', 'int16', 0) hEnt.Implementation.addArgument(arg); Для семафора и взаимоисключающих записей, используйте функции arg = getTflDWorkFromString(... 'd1', 'void*') hEnt.addDWorkArg(arg); arg = hEnt.getTflArgFromString(... 'y1', 'void'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setRetrurn(arg); arg = hEnt.getTflArgFromString(... 'u1', 'integer'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString(... 'd1', 'void**'); hEnt.Implementation.addArgument(arg); |
Необходимо задать несколько подобных отображений, вы хотите минимизировать код, чтобы записать, и записи не требуют выравнивания данных, используют сетевые наклонные аргументы или включают взаимоисключающие замены или семафор. | Вызовите hEnt = createCRLEntry(hTable, ... 'double y1 = sin(double u1)', ... 'mySin'); |
Следующий код показывает третий подход, перечисленный в таблице для определения выходного аргумента реализации и определений входного параметра для функции sin
:
% Implementation Args arg = hEnt.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setReturn(arg); arg = hEnt.getTflArgFromString('u1','double'); hEnt.Implementation.addArgument(arg);
Добавьте запись в заменяющую таблицу кода путем вызова функционального addEntry
.
addEntry(hTable, hEnt);
После того, как вы создаете или изменяете заменяющую запись таблицы кода, подтверждаете ее путем вызова ее в командной строке MATLAB. Например:
hTbl = crl_table_sinfcn
hTbl = RTW.TflTable Version: '1.0' AllEntries: [2x1 RTW.TflCFunctionEntry] ReservedSymbols: [] StringResolutionMap: []
Если таблица включает ошибки, MATLAB сообщает о них. Следующие примеры показывают, как MATLAB сообщает об опечатке в имени типа данных:
hTbl = crl_table_sinfcn
??? RTW_CORE:tfl:TflTable: Unsupported data type, 'dooble'. Error in ==> crl_table_sinfcn at 7 hTable.registerCFunctionEntry(100, 1, 'sin', 'dooble', 'sin_dbl', ...
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл, например, crl_table_sinfcn.m
.
Затем, от ваших требований, определите, необходимо ли указать информацию сборки для заменяющего кода.