coder.ceval Вызовы внешних функций coder.ceval функция вызывает внешние функции C/C + + из кода, сгенерированного MATLAB® код. Программное обеспечение замены кода поддерживает замену функции, которую вы задаете в вызове coder.ceval. Приложением этого сценария замены кода является запись типового кода MATLAB, который можно настроить для других платформ с заменой кода. Библиотека замещения кода может определять аппаратные замены кода для вызова функции. Использование coder.ceval в коде MATLAB, из которого вы хотите сгенерировать код С с помощью:
Файлы MATLAB Coder™
Код MATLAB в Simulink® Блок MATLAB function
Для разработки библиотеки замещения кода используйте интерактивный или программный подход. Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода».
Для примеров в интерактивной разработке библиотеки замены кода и программной разработки библиотеки замены кода необходимо настроить следующее:
Настраиваемая функция 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, который использует 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 double и 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;
Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в вашей таблице, вызвав функцию entry 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 и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.