Замените вызовы 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);
    
  • call_my_add.m функции 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);
    

Интерактивная внешняя заменяющая спецификация вызова функции с заменяющим инструментом кода

Этот пример показывает, как задать заменяющую запись таблицы кода для функции MATLAB, которая вызывает coder.ceval, чтобы вызвать внешнюю функцию C. Пример показывает, как задать запись в интерактивном режиме с Заменяющим Инструментом Кода.

  1. Идентифицируйте или создайте код C/C++ и соответствующие заголовочные файлы, функция MATLAB, которая вызывает coder.ceval, тестовую функцию MATLAB и исходные и заголовочные файлы для вашего заменяющего кода. Чтобы следовать наряду с этим примером, настройте файлы, идентифицированные в Файлах В качестве примера.

  2. В Заменяющем Инструменте Кода добавьте таблицу, выберите ту таблицу и добавьте функциональную запись. Для получения дополнительной информации смотрите, Задают Заменяющие Отображения Кода.

  3. На вкладке Mapping Information выберите Custom для параметра Function.

  4. В текстовом поле function-name введите пользовательское имя функции. В данном примере введите имя my_add.

  5. Под полем списка Conceptual arguments нажмите +, чтобы добавить три аргумента. По умолчанию инструмент задает выходной аргумент y1 и входные параметры u1 и u2 типа double.

  6. В разделе Replacement function> Function prototype введите имя my_add_replacement в текстовом поле Name.

  7. Под полем списка Function arguments нажмите +, чтобы добавить три аргумента реализации функции. По умолчанию инструмент задает выходной аргумент y1 и входные параметры u1 и u2, типа double. Используйте настройки по умолчанию.

  8. В поле Function signature preview, если вы видите ожидаемую функциональную подпись, нажимают Apply. Функциональная подпись для этого примера, появляется как:

    double my_add_replacement(double u1, double u2);
  9. На вкладке Build Information задайте my_add_replacement.h для параметра Implementation header file и my_add_replacement.c для Implementation source file.

  10. Нажмите Validate entry.

  11. Сохраните заменяющую таблицу кода в той же папке как my_add_replacement.c. Назовите файл crl_table_my_add.m.

Протестировать пример:

  1. Укажите таблицу, которая содержит запись в заменяющей библиотеке кода.

  2. Сконфигурируйте генератор кода, чтобы пользоваться заменяющей библиотекой кода и включать Заменяющий Отчет Кода в отчет генерации кода.

  3. Сгенерируйте код и отчет.

  4. Рассмотрите замены кода.

Программируемая внешняя заменяющая спецификация вызова функции

Этот пример показывает, как задать заменяющую запись таблицы кода для функции MATLAB, которая вызывает coder.ceval, чтобы вызвать внешнюю функцию C. Пример показывает, как задать запись программно.

  1. Идентифицируйте или создайте код C/C++ и соответствующие заголовочные файлы, функция MATLAB, которая вызывает coder.ceval, чтобы вызвать функцию C/C++, тестовую функцию MATLAB и исходные и заголовочные файлы для вашего заменяющего кода. Чтобы следовать наряду с этим примером, настройте файлы, идентифицированные в Файлах В качестве примера.

  2. Создайте табличный файл определения, который содержит функциональное определение. Например:

    function hLib = crl_table_my_add
  3. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

  4. Создайте запись для отображения функции с вызовом функции RTW.TflCFunctionEntry.

    hEnt = RTW.TflCFunctionEntry;
  5. Параметры записи функции множества с вызовом функции setTflCFunctionEntryParameters.

    hEnt.setTflCFunctionEntryParameters( ...
              'Key', 'my_add', ...
              'Priority', 100, ...
              'ImplementationName', 'my_add_replacement', ...
              'ImplementationHeaderFile', 'my_add_replacement.h', ...
              'ImplementationSourceFile', 'my_add_replacement.c');
  6. Создайте концептуальные аргументы y1, u1 и u1. Этот пример использует вызовы getTflArgFromString и функций addConceptualArg, чтобы создать и добавить аргументы.

    arg = hEnt.getTflArgFromString('y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.addConceptualArg(arg);
    
    arg = hEnt.getTflArgFromString('u1','double');
    hEnt.addConceptualArg(arg);
    
    arg = hEnt.getTflArgFromString('u2','double');
    hEnt.addConceptualArg(arg);
  7. Создайте аргументы реализации и добавьте их в запись. Этот пример использует вызовы функции getTflArgFromString, чтобы создать аргументы реализации. Эти функции сопоставляют с аргументами в заменяющем прототипе функции: выходной аргумент y1 и входные параметры u1 и u2. Для каждого аргумента пример использует удобный метод setReturn или addArgument, чтобы задать, является ли аргумент возвращаемым значением или аргументом. Для каждого аргумента этот пример добавляет аргумент в массив записи аргументов реализации.

    arg = hEnt.getTflArgFromString('y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEnt.Implementation.setReturn(arg); 
    
    arg = hEnt.getTflArgFromString('u1','double');
    hEnt.Implementation.addArgument(arg);
    
    arg = hEnt.getTflArgFromString('u2','double');
    hEnt.Implementation.addArgument(arg);
    
  8. Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry.

    hLib.addEntry(hEnt); 
    
  9. Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.

Протестировать пример:

  1. Укажите таблицу, которая содержит запись в заменяющей библиотеке кода.

  2. Сконфигурируйте генератор кода, чтобы пользоваться заменяющей библиотекой кода и включать Заменяющий Отчет Кода в отчет генерации кода.

  3. Сгенерируйте код и отчет.

  4. Рассмотрите замены кода.

Похожие темы