coder.ceval
Вызовы внешних функцийcoder.ceval
вызовы функции внешний C/C++ функционируют из кода, сгенерированного из кода MATLAB®. Заменяющее программное обеспечение кода поддерживает замену функции, которую вы задаете в вызове coder.ceval
. Применение этого заменяющего сценария кода должно записать типовой код MATLAB, который можно настроить для других платформ с заменами кода. Заменяющая библиотека кода может задать специфичные для оборудования замены кода для вызова функции. Используйте coder.ceval
в коде MATLAB, из которого вы хотите сгенерировать использование кода С:
MATLAB Coder™
Код MATLAB в блоке MATLAB function Simulink®
Чтобы разработать заменяющую библиотеку кода используют или интерактивный или программируемый подход. Для получения дополнительной информации смотрите, Разрабатывают Заменяющую Библиотеку Кода.
Для примеров в В интерактивном режиме Разрабатывают Заменяющую Библиотеку Кода и Программно Разрабатывают Заменяющую Библиотеку Кода, вы, должно быть, настроили следующее:
Пользовательские C функционируют my_add.c
.
/* my_add.c */ #include "my_add.h" double my_add(double in1, double in2) { return in1 + in2; }
Пользовательский заголовочный файл C my_add.h
.
/* my_add.h */ double my_add(double in1, double in2);
Функция MATLAB call_my_add.m
, который использует coder.ceval
вызвать my_add.c
.
function y = call_my_add(in1, in2) %#codegen y=0.0; if ~coder.target('Rtw') % Executing in MATLAB, call MATLAB equivalent of C function my_add y= in1+in2; else % Executing in generated code, call C function my_add y = coder.ceval('my_add', in1, in2); end
Тест MATLAB функционирует call_my_add_test.m
, который вызывает call_my_add.m
.
in1=10; in2=20; y = call_my_add(in1, in2); disp('Output') disp('y =') disp(y);
Замена C функционирует my_add_replacement.c
.
/* my_add_replacement.c */ #include "my_add_replacement.h" double my_add_replacement(double in1, double in2) { return in1 + in2; }
Замена C заголовочный файл my_add_replacement.h
.
/* my_add_replacement.h */ double my_add_replacement(double in1, double in2);
Откройте Code Replacement Tool (crtool) из командной строки MATLAB со следующей командой:
>>crtool
Составление таблицы.
В crtool меню выберите File> New Table.
На правой панели назовите таблицу crl_table_coder_cevals_calls
. Нажмите Apply.
Создайте запись. В crtool меню выберите File> New entry> Function.
Создайте параметры записи. В Function выпадающий список выберите custom
. Функциональная информация появляется в crtool. В данном примере задайте параметр как my_add
.
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую вы хотите заменить. В подразделе Conceptual function crtool задайте возвращаемый аргумент, y1
, и входные параметры, u1
и u2
с Data Type двойных и Argument Type Скаляра.
Создайте представление реализации. Представление реализации описывает подпись оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, установите флажок Make conceptual and implementation argument types the same.
Задайте Name для заменяющей функции под Function prototype.
Укажите информацию сборки. Кликните по вкладке Build Information, чтобы открыть панель Requirements сборки. Задайте файлы (источник, заголовок, объект), которого генератор кода требует для замены кода. В данном примере установите Implementation header file на my_add_replacement.h
.
Подтвердите и сохраните таблицу. Кликните по вкладке Mapping Information и проверьте, что поля заполнены в как показано. Нажмите Validate entry. В crtool меню выберите File> Save table> Save.
Укажите заменяющую библиотеку кода. Регистрация создает библиотеку, состоявшую из таблиц, которые вы задаете. Выберите File> Generate registration file. В Сгенерировать регистрационном диалоговом окне файла заполните эти поля:
Чтобы пользоваться вашей заменяющей библиотекой кода, обновите свой текущий сеанс работы с MATLAB с командой:
>>sl_refresh_customizations
Проверьте заменяющую библиотеку кода. Из командной строки MATLAB откройте библиотеку при помощи Code Replacement Viewer и проверьте, что таблица и запись правильно заданы. Для получения дополнительной информации смотрите, Проверяют Заменяющую Библиотеку Кода. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать проблемы.
Откройте программируемый интерфейс в меню MATLAB путем выбора New> Function.
Составление таблицы.
Создайте функцию с именем вашей заменяющей таблицы библиотеки кода, которая не имеет аргументов и возвращает объект таблицы. Можно использовать эту функцию, чтобы вызвать заменяющую таблицу библиотеки кода.
Создайте объект таблицы путем вызова RTW.TflTable
.
function hTable = crl_table_coder_cevals_calls() % Create a function to call the code replacement library table %% Create a table object hTable = RTW.TflTable;
Создайте запись. Поскольку этот пример заменяет функцию, создайте заменяющую запись кода в своей таблице путем вызывания функции записи RTW.TflCFunctionEntry
.
function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry;
Создайте параметры записи. Поскольку это, примеры заменяют функцию, создают параметры записи путем вызова функционального setTflCFunctionEntryParameters
.
function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters hEntry.setTflCFunctionEntryParameters( ... 'Key', 'my_add', ... 'Priority', 100, ... 'ImplementationName', 'my_add_replacement', ... 'ImplementationHeaderFile', 'my_add_replacement.h', ... 'ImplementationSourceFile', 'my_add_replacement.c');
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функциональный getTflArgFromString
.
function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters hEntry.setTflCFunctionEntryParameters( ... 'Key', 'my_add', ... 'Priority', 100, ... 'ImplementationName', 'my_add_replacement', ... 'ImplementationHeaderFile', 'my_add_replacement.h', ... 'ImplementationSourceFile', 'my_add_replacement.c'); %% Create the conceptual representation arg = hEntry.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u1','double'); hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u2','double'); hEntry.addConceptualArg(arg);
Создайте представление реализации. Представление реализации описывает подпись оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства в качестве концептуальных аргументов, вызовите функциональный getTflArgFromString
.
function hTable = crl_table_coder_cevals_calls() % Create a code replacement library table %% Create a table object hTable = RTW.TflTable; %% Create an entry hEntry = RTW.TflCFunctionEntry; %% Create entry parameters hEntry.setTflCFunctionEntryParameters( ... 'Key', 'my_add', ... 'Priority', 100, ... 'ImplementationName', 'my_add_replacement', ... 'ImplementationHeaderFile', 'my_add_replacement.h', ... 'ImplementationSourceFile', 'my_add_replacement.c'); %% Create the conceptual representation arg = hEntry.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u1','double'); hEntry.addConceptualArg(arg); arg = hEntry.getTflArgFromString('u2','double'); hEntry.addConceptualArg(arg); %% Create the implementation representation arg = hEntry.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEntry.Implementation.setReturn(arg); arg = hEntry.getTflArgFromString('u1','double'); hEntry.Implementation.addArgument(arg); arg = hEntry.getTflArgFromString('u2','double'); hEntry.Implementation.addArgument(arg); %% Add the entry to the table hTable.addEntry(hEntry);
Укажите информацию сборки. В параметрах записи задайте файлы (заголовок, источник, объект), в котором генератор кода нужен для замены кода. В данном примере создайте информацию, не требуется.
Подтвердите и сохраните файл настройки. В меню MATLAB сохраните этот файл настройки путем выбора File> Save. Из командной строки подтвердите заменяющую таблицу библиотеки кода путем вызова его:
>> hTable = crl_table_coder_cevals_calls
Укажите заменяющую библиотеку кода. Регистрация создает заменяющую библиотеку кода путем определения имени библиотеки, заменяющих таблиц кода и другой информации. Создайте регистрационный файл при помощи этих технических требований:
function rtwTargetInfo(cm) cm.registerTargetInfo(@loc_register_crl); end function this = loc_register_crl this(1) = RTW.TflRegistry; this(1).Name = 'CRL for coder.ceval calls to external functions code replacement’; this(1).TableList = {' crl_table_coder_cevals_calls.m'}; % table created in this example this(1).TargetHWDeviceType = {'*'}; this(1).Description = 'Example code replacement library'; end
Чтобы пользоваться вашей заменяющей библиотекой кода, обновите свой текущий сеанс работы с MATLAB с командой:
>>sl_refresh_customizations
Проверьте заменяющую библиотеку кода. Из командной строки MATLAB откройте библиотеку при помощи Code Replacement Viewer и проверьте, что таблица и запись правильно заданы. Для получения дополнительной информации смотрите, Проверяют Заменяющую Библиотеку Кода. Сконфигурируйте свою модель, чтобы пользоваться заменяющей библиотекой кода, сгенерировать код и проверить, что замена происходит как ожидалось. Если неожиданное поведение происходит, исследуйте журналы удачи и неудачи, чтобы диагностировать проблемы.