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

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

Инициализация функции

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

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

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

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

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

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

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

Вызов функций инициализации

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

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

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

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

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

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

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

Если вы генерируете код С++ с интерфейсом класса, то генератор кода производит конструктор классов и деструктор, которые выполняют операции инициализации и завершения. Вам не нужно вручную вызывать 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. The 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, которую вы задаете во время генерации кода. Функция terminate освобождает выделенную память и выполняет другие операции очистки.

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

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

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

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

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

Функции terminate также используются, чтобы очистить состояние постоянных переменных. Постоянная переменная сохраняет свое состояние до тех пор, пока не будет инициирована функция завершения. Для получения дополнительной информации смотрите Сгенерировать код для стойких переменных.

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

Определите эту функцию 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;
}

См. также

| |

Похожие темы