Эта тема показывает вам, как разработать заменяющую библиотеку кода, чтобы оптимизировать производительность функций памяти. Этот определенный пример показывает вам, как задать замену кода для memcpy
функция.
Откройте среду. Сочинять Code Replacement Tool (crtool), в командной строке MATLAB, введите:
>>crtool
Составление таблицы.
В crtool меню выберите File> New Table.
На правой панели назовите таблицу crl_table_memcpy
. Нажмите Apply.
Создайте запись. В crtool меню выберите File> New entry> Function.
Создайте параметры записи. В Function выпадающий список выберите memcpy
. Информация об алгоритме появляется в crtool. В данном примере оставьте параметр незаданным.
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую вы хотите заменить. В подразделе Conceptual function crtool задайте возвращаемый аргумент, y1, с Data Type пустоты и Argument Type Указателя, входных параметров, u1 и u2 с Data Type пустоты и Argument Type Указателя и u3 с Data Type интеграла без знака и Argument Type Скаляра.
Создайте представление реализации. Представление реализации описывает подпись функции оптимизации. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, установите флажок Make conceptual and implementation argument types the same.
Задайте Name для заменяющей функции под Function prototype.
Укажите информацию сборки. Кликните по вкладке Build Information, чтобы открыть панель Requirements сборки. Задайте файлы (источник, заголовок, объект), которого генератор кода требует для замены кода. В данном примере вы не должны указывать информацию сборки.
Подтвердите и сохраните. Во вкладке Mapping Information нажмите Validate entry. В crtool меню выберите File> Save table> Save.
Укажите заменяющую библиотеку кода. Регистрация создает библиотеку, состоявшую из таблиц, которые вы задаете. Выберите File> Generate registration file. В Сгенерировать регистрационном диалоговом окне файла заполните поля как показано:
Проверьте заменяющую библиотеку кода. Откройте библиотеку при помощи Code Replacement Viewer и проверьте, что таблица и запись правильно заданы. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать.
Откройте среду. В меню MATLAB выберите New> Function.
Составление таблицы.
Создайте функцию, чтобы вызвать вашу заменяющую таблицу библиотеки кода. Функция не должна иметь аргументов и возвращать объект таблицы.
Создайте объект таблицы путем вызова RTW.TflTable
.
function hTable = crl_table_memcpy() % Create a function to call the code replacement library table %% Create a table object hTable = RTW.TflTable;
Создайте запись. Поскольку этот пример заменяет функцию, создайте заменяющую запись кода в своей таблице путем вызывания функции записи RTW.TflCFunctionEntry
.
function hTable = crl_table_memcpy() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = rtw.TflCFunctionEntry;
Создайте параметры записи. Начиная с этого примеры заменяют функцию, создайте параметры записи путем вызова функционального setTflCFunctionEntryParameters
.
function hTable = crl_table_memcpy() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters % Set SideEffects to 'true' for function returning void to prevent it from % being optimized away. setTflCFunctionEntryParameters(fcn_entry, ... 'Key', 'memcpy', ... 'Priority', 90, ... 'ImplementationName', 'memcpy_int', ... 'ImplementationHeaderFile', 'memcpy_int.h',... 'SideEffects', true);
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую вы хотите заменить. Существует несколько способов создать концептуальное представление. Чтобы явным образом задать свойства аргумента, вызовите функциональный createAndAddConceptualArg
.
function hTable = crl_table_memcpy() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters setTflCFunctionEntryParameters(fcn_entry, ... 'Key', 'memcpy', ... 'Priority', 90, ... 'ImplementationName', 'memcpy_int', ... 'ImplementationHeaderFile', 'memcpy_int.h',... 'SideEffects', true); %% Create conceptual arguments arg = getTflArgFromString(hTable, 'y1', 'void*'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(fcn_entry, arg); arg = getTflArgFromString(hTable, 'u1', 'void*'); addConceptualArg(fcn_entry, arg); arg = getTflArgFromString(hTable, 'u2', 'void*'); addConceptualArg(fcn_entry, arg); arg = getTflArgFromString(hTable, 'u3', 'size_t'); addConceptualArg(fcn_entry, arg);
Создайте представление реализации. Представление реализации описывает подпись функции оптимизации. Существует несколько способов создать представление реализации. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, вызовите функциональный copyConceptualArgsToImplementation
. Добавьте полную запись в таблицу путем вызова функционального addEntry
.
function hTable = crl_table_memcpy() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters setTflCFunctionEntryParameters(fcn_entry, ... 'Key', 'memcpy', ... 'Priority', 90, ... 'ImplementationName', 'memcpy_int', ... 'ImplementationHeaderFile', 'memcpy_int.h',... 'SideEffects', true); %% Create conceptual arguments arg = getTflArgFromString(hTable, 'y1', 'void*'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(fcn_entry, arg); arg = getTflArgFromString(hTable, 'u1', 'void*'); addConceptualArg(fcn_entry, arg); arg = getTflArgFromString(hTable, 'u2', 'void*'); addConceptualArg(fcn_entry, arg); arg = getTflArgFromString(hTable, 'u3', 'size_t'); addConceptualArg(fcn_entry, arg); %% Create the Conceptual Representation copyConceptualArgsToImplementation(fcn_entry); %% Add the entry to the table hTable.addEntry(hEntry);
Укажите информацию сборки. В параметрах записи задайте файлы (заголовок, источник, объект), в котором генератор кода нужен для замены кода. В данном примере создайте информацию, не требуется.
Подтвердите и сохраните. В меню MATLAB сохраните этот файл настройки путем выбора File> Save. Из командной строки подтвердите заменяющую таблицу библиотеки кода путем вызова его:
>> hTable = crl_table_memcpy
Укажите заменяющую библиотеку кода. Регистрация создает заменяющую библиотеку кода путем определения имени библиотеки, заменяющих таблиц кода и другой информации. Создайте регистрационный файл с этими спецификациями:
function rtwTargetInfo(cm) cm.registerTargetInfo(@loc_register_crl); end function this = loc_register_crl this(1) = RTW.TflRegistry; this(1).Name = 'CRL for memory function replacement’; this(1).TableList = {'crl_table_memcpy.m'}; % table created in this example this(1).TargetHWDeviceType = {'*'}; this(1).Description = 'Example code replacement library'; end
Проверьте заменяющую библиотеку кода. Откройте библиотеку при помощи Code Replacement Viewer и проверьте, что таблица и запись правильно заданы. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать.