exponenta event banner

Шаблоны кода MATLAB, требующие непустой функции инициализации в сгенерированном коде

Проблема

При создании автономного кода из кода MATLAB ® функция инициализации не создается:

  • В coder.EmbeddedCodeConfig объект, IncludeInitializeFcn имеет значение false.

  • Кроме того, в приложении MATLAB Coder™ на вкладке «Все параметры» для параметра «Требуется инициализация функции» установлено значение No.

Кроме того, необходимо убедиться, что пользовательский код, отображаемый в созданной функции инициализации, пуст:

  • В coder.EmbeddedCodeConfig объект, CustomInitializer имеет значение ''.

  • Кроме того, в приложении MATLAB Coder на вкладке Custom Code функция Custom C Code for Generated Files for initialize пуста.

Вы все еще получаете следующее сообщение об ошибке:

The initialize function is not empty, but the IncludeInitializeFcn configuration setting requests that
the initialize function be omitted.

Решение

В некоторых ситуациях генератор кода определяет, что функция инициализации должна быть непустой, и создает код для функции инициализации. Эта генерация кода может произойти, даже если пользовательский код для указанной функции инициализации пуст. Отсутствие этого сгенерированного кода в функции инициализации приводит к тому, что сгенерированные функции точки входа работают в недопустимом состоянии. В таких ситуациях, если функция инициализации не генерируется, генератор кода выдает сообщение об ошибке.

Чтобы устранить эту проблему, включите функцию инициализации в созданный код, выполнив одно из следующих действий:

  • В coder.EmbeddedCodeConfig объект, установка IncludeInitializeFcn кому true (это значение является значением по умолчанию).

  • В приложении MATLAB Coder на вкладке All Settings установите для параметра Initialize Function Required значение Yes (этот параметр используется по умолчанию).

Примерами шаблонов кода MATLAB, которые требуют непустой функции инициализации в сгенерированном коде, являются:

  • Код MATLAB содержит операцию, которая может генерировать нефинитные значения (Inf или NaN). Например, определите функцию MATLAB foo который вызывает factorial. factorial функция быстро растет и возвращается Inf для входных данных, превышающих определенное пороговое значение. Для ввода типа double, пороговое значение 170. Выполнение factorial(171) в возвращениях MATLAB Inf.

    function y = foo(a)
    y = factorial(a);
    end

    Создание статической библиотеки для foo. В coder.EmbeddedCodeConfig объект cfg, задайте параметр CustomInitializer в пустой символьный массив. Установка параметра IncludeInitializeFcn кому true. Эти значения являются значениями по умолчанию для параметров.

    cfg = coder.config('lib');
    
    cfg.CustomInitializer = '';  %These are the default values
    cfg.IncludeInitializeFcn = true;
    
    codegen -config cfg foo -args {1}

    Генератор кода автоматически создает непустую функцию инициализации foo_initialize который вызывает поддержку кода для нефинитных данных. Эта функция вызывает rt_InitInfAndNaN, который определен в другом созданном файле rt_nonfinite.c.

    /* Include Files */
    #include "foo_initialize.h"
    #include "foo.h"
    #include "foo_data.h"
    #include "rt_nonfinite.h"
    
    /* Function Definitions */
    
    /*
     * Arguments    : void
     * Return Type  : void
     */
    void foo_initialize(void)
    {
      rt_InitInfAndNaN();
      isInitialized_foo = true;
    }
    
    /*
     * File trailer for foo_initialize.c
     *
     * [EOF]
     */

  • Код MATLAB используется global или persistent переменные. Например, определите эту функцию MATLAB:

    function y = bar
    global g
    y = g;
    end

    Создание статической библиотеки для bar. Укажите начальное значение g как 1. В coder.EmbeddedCodeConfig объект cfg, задайте параметр CustomInitializer в пустой символьный массив. Установка параметра IncludeInitializeFcn кому true. Эти значения являются значениями по умолчанию для параметров.

    cfg = coder.config('lib');
    
    cfg.CustomInitializer = '';  %These are the default values
    cfg.IncludeInitializeFcn = true;
    
    codegen -config cfg -globals {'g',1} bar

    Генератор кода автоматически создает непустую функцию инициализации bar_initialize инициализирующий g.

    /* Include Files */
    #include "bar_initialize.h"
    #include "bar.h"
    #include "bar_data.h"
    
    /* Function Definitions */
    
    /*
     * Arguments    : void
     * Return Type  : void
     */
    void bar_initialize(void)
    {
      g = 1.0;
      isInitialized_bar = true;
    }
    
    /*
     * File trailer for bar_initialize.c
     *
     * [EOF]
     */

См. также

Связанные темы