Используйте сгенерированный, инициализируют и отключают функции

При генерации кода C/C++ из кода MATLAB® генератор кода автоматически производит две функции обслуживания, инициализируйте и завершите работу. Инициализировать функция инициализирует состояние, с которым работают сгенерированные функции точки входа C/C++. Это должно быть названо, прежде чем вы вызовете функции точки входа впервые. Оконечная функция освобождает выделенную память и выполняет другие операции очистки. Это должно быть названо после того, как вы вызовете функции точки входа в последний раз.

Инициализируйте функцию

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

  • Вызовы поддержки кода для неличных данных (Inf и NaN). Эти вызовы сгенерированы, если ваш код MATLAB содержит операции, которые могут сгенерировать неличные значения.

  • Код, который инициализирует global или persistent переменные.

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

    • В объекте настройки кода, набор CustomInitializer к вектору символов, который содержит пользовательский код.

    • В приложении MATLAB Coder™, на вкладке Custom Code, задают пользовательский код для инициализировать функции.

В определенных ситуациях никакой код инициализации не необходим, и сгенерированные инициализируют функцию, пусто.

Вызов инициализирует функции

Если вы генерируете MEX-функцию, сгенерированный код автоматически включает вызов инициализировать функции. Если вы генерируете автономный код, существует две возможных ситуации:

  • По умолчанию, если инициализировать функция непуста, генератор кода включает вызов инициализировать функции в начале сгенерированных функций точки входа C/C++. Сгенерированный код также включает проверки, чтобы убедиться, что инициализировать функция вызвана автоматически только однажды, даже если существует несколько функций точки входа. В этой ситуации вы не должны вручную вызывать инициализировать функцию.

    Если инициализировать функция пуста, сгенерированные функции точки входа C/C++ не включают вызов инициализировать функции.

  • Можно принять решение не включать вызов инициализировать функции в сгенерированных функциях точки входа. Выполнить одно из следующих действий:

    • В coder.CodeConfig или coder.EmbeddedCodeConfig объект, набор RunInitializeFcn к false.

    • В приложении MATLAB Coder, на вкладке All Settings, устанавливает Automatically run the initialize function на No.

    Если вы делаете этот выбор, необходимо вручную вызвать инициализировать функцию, прежде чем вы вызовете сгенерированную функцию точки входа впервые. Не вызов инициализировать функция заставляет сгенерированные функции точки входа работать с недопустимым состоянием.

Если вы генерируете Код С++ с интерфейсом класса, то генератор кода производит конструктора класса и деструктор, которые выполняют операции инициализации и завершения. Вы не должны вручную вызывать initialize и terminate функции. Смотрите Генерируют Код С++ с Интерфейсом Класса.

Примеры сгенерированных инициализируют функции

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

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

    function y = bar
    global g
    y = g;
    end

    Сгенерируйте статическую библиотеку для bar. Задайте начальное значение g как 1.

    codegen -config:lib -globals {'g',1} bar

    Генератор кода производит файл bar_initialize.c в work\codegen\lib\bar, где work папка, которая содержит bar.m. Функциональный bar_initialize инициализирует глобальную переменную g.

    void bar_initialize(void)
    {
      g = 1.0;
      isInitialized_bar = true;
    }
    
    Сгенерированные C функционируют bar включает вызов bar_initialized. Это использует булев isInitialized_bar убедиться, что инициализировать функция вызвана автоматически только однажды.

    double bar(void)
    {
      if (!isInitialized_bar) {
        bar_initialize();
      }
    
      return g;
    }
    
  • Ваш код MATLAB содержит операцию, которая может сгенерировать неличные значения (Inf или NaN). Например, задайте функцию MATLAB foo это вызывает factorial. factorial функция растет быстро и возвращает Inf для входных параметров, больше, чем определенный порог. Для входа типа double, порогом является 170. Выполнение factorial(171) в MATLAB возвращает Inf.

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

    Сгенерируйте статическую библиотеку для foo.

    codegen -config:lib foo -args {1}

    Генератор кода производит файл foo_initialize.c в work\codegen\lib\foo, где work папка, которая содержит foo.m. Функциональный foo_initialize вызовы, поддерживающие код для неличных данных, rt_InitInfAndNaN, который задан в другом сгенерированном файле rt_nonfinite.c.

    void foo_initialize(void)
    {
      rt_InitInfAndNaN();
      isInitialized_foo = true;
    }

Оконечная функция

Именем сгенерированной оконечной функции является primary_function_name _terminate, где primary_function_name является именем первой функции точки входа MATLAB, которую вы задаете при генерации кода. Оконечная функция освобождает выделенную память и выполняет другие операции очистки.

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

  • В объекте настройки кода, набор CustomTerminator к вектору символов, который содержит пользовательский код.

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

Если вы генерируете MEX-функцию, сгенерированный код автоматически включает вызов оконечной функции.

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

Оконечные функции также используются, чтобы очистить состояние персистентных переменных. Персистентная переменная сохраняет свое состояние, пока оконечная функция не вызывается. Для получения дополнительной информации смотрите, Генерируют Код для Персистентных Переменных.

Пример сгенерированной оконечной функции

Задайте эту функцию MATLAB:

function y = bar
global g
y = g;
end

Сгенерируйте статическую библиотеку для bar. Задайте начальное значение g как 1.

codegen -config:lib -globals {'g',1} bar

Генератор кода производит файл bar_terminate.c в work\codegen\lib\bar, где work папка, которая содержит bar.m. Функциональный bar_terminate устанавливает булев isInitialized_bar (который был установлен в true после инициализировать вызова функции) к false.

void bar_terminate(void)
{
  isInitialized_bar = false;
}

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

| |

Похожие темы