При генерации кода 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; }
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; }
coder.CodeConfig
| coder.EmbeddedCodeConfig
| coder.MexCodeConfig