Замените 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);
    

Интерактивная разработка библиотеки замещения кода

  1. Откройте Code Replacement Tool (crtool) из командной строки MATLAB с помощью следующей команды:

    >>crtool
  2. Составьте таблицу.

    1. В меню crtool выберите File > New Table.

    2. На правой панели назовите таблицу crl_table_coder_cevals_calls. Нажмите Apply.

  3. Создайте запись. В меню crtool выберите File > New entry > Function.

  4. Создайте параметры входа. В раскрывающемся списке Function выберите custom. Информация о функции появится в crtool. В данном примере задайте параметр следующим my_add .

  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. В Conceptual function подразделе crtool задайте возвращаемый аргумент y1и входные параметры, u1 и u2 с Data Type double и Argument Type скаляр.

  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, установите флажок Make conceptual and implementation argument types the same.

    Задайте Name для функции замены под Function prototype.

  7. Укажите сведения о сборке. Перейдите на вкладку Build Information, чтобы открыть панель Requirements к сборке. Укажите файлы (источник, заголовок, объект), которые требуется генератору кода для замены кода. В данном примере установите Implementation header file равным my_add_replacement.h.

  8. Проверьте и сохраните таблицу. Щелкните вкладку Mapping Information и проверьте заполнение полей как показано на рисунке. Нажмите Validate entry. В меню crtool выберите File > Save table > Save.

  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку, состоящую из заданных таблиц. Выберите File > Generate registration file. В диалоговом окне Сгенерировать файл регистрации заполните следующие поля:

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс работы с MATLAB командой:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Программно разрабатывайте библиотеку замещения кода

  1. Откройте программный интерфейс из меню MATLAB, выбрав New > Function.

  2. Составьте таблицу.

    1. Создайте функцию с именем таблицы библиотеки замещения кода, которая не имеет аргументов и возвращает объект таблицы. Можно использовать эту функцию для вызова таблицы библиотеки замещения кода.

    2. Создайте объект таблицы путем вызова 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;
    
  3. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в вашей таблице, вызвав функцию 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;
    
  4. Создайте параметры входа. Поскольку эти примеры заменяют функцию, создайте параметры входа путем вызова функции 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');
  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функцию 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);
    
  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию 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); 
  7. Укажите сведения о сборке. В параметрах входа укажите файлы (заголовок, источник, объект), которые нужны генератору кода для замены кода. В данном примере информация о сборке не требуется.

  8. Проверьте и сохраните файл индивидуальной настройки. В меню MATLAB сохраните этот файл индивидуальной настройки, выбрав File > Save. В командной строке проверьте таблицу библиотеки замещения кода, вызвав ее:

    >> hTable =  crl_table_coder_cevals_calls
  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку замещения кода путем определения имени библиотеки, таблиц замещения кода и другой информации. Создайте файл регистрации с помощью следующих спецификаций:

    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

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Похожие темы