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

Проблема

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

  • В coder.EmbeddedCodeConfig объект, IncludeInitializeFcn установлен в false.

  • В качестве альтернативы в приложении MATLAB Coder™, на вкладке All Settings, Initialize Function Required установлен в No.

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

  • В coder.EmbeddedCodeConfig объект, CustomInitializer установлен в ''.

  • В качестве альтернативы в приложении MATLAB Coder, на вкладке Custom Code, Custom C Code for Generated Files для инициализирует функцию, пусто.

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

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]
     */

Смотрите также

Похожие темы