Замените функции MATLAB, заданные в блоках MATLAB function

В этом примере показано, как использовать замену кода, чтобы заменить функцию MATLAB®, заданную в блоке MATLAB function.

  1. Откройте ex_replace модель. В командной строке, введите:

    addpath(fullfile(docroot,'toolbox','ecoder','examples'))
    ex_replace

  2. Просмотрите код блока MATLAB function. В модели дважды кликните блок MATLAB Function, чтобы просмотреть код в редакторе MATLAB.

    function y = customFcn(u1, u2) %#codegen
    % This block supports MATLAB for code generation.
    
    % Replace this MATLAB function with CRL replacement function and if no
    % CRL replacement is found, generate an error during code generation.
    coder.replace('-errorifnoreplacement');
    
    assert(isa(u1,'int32'));
    assert(isa(u2,'int32'));
    
    y = power(u1,u2);

    coder.replace('-errorifnoreplacement') оператор дает генератору кода команду заменять эту функцию MATLAB на заменяющую библиотечную функцию кода. Генератор кода производит ошибку, если он не находит соответствие.

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

    function hTable = crl_table_coderreplace()
    
  4. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

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

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

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

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

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

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

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

  1. Укажите заменяющее отображение кода.

  2. Создайте файлы MyMath.c и MyMath.h это задает заменяющую функцию, scalarFcnReplacement, который имеет два int32 входные параметры и один int32 вывод .

    MyMath.c

    #include "MyMath.h"
    
    void scalarFcnReplacement(int32_T u1, int32_T u2, int32_T* y1 ) {
        *y1 = u1^u2;
    }

    MyMath.h

    #ifndef _ScalarMath_h
    #define _ScalarMath_h
    
    #include "rtwtypes.h"
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    extern void scalarFcnReplacement(int32_T u1, int32_T u2, int32_T* y1);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif

  3. Откройте ex_replace модель.

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

  5. Сгенерируйте заменяющий код и отчет генерации кода.

  6. Рассмотрите замены кода. В отчете генерации кода просмотрите сгенерированный код для ex_replace.c.

    void ex_replace_step(void)
    {
       int32_T y;
       scalarFcnReplacement(ex_replace_U.In1, ex_replace_U.In2, &y);
       ex_replace_Y.Out1 = y;
    }

Похожие темы