При генерации кода C/C + + из кода MATLAB ® генератор кода автоматически создает две функции ведения хозяйства, инициализируют и завершают работу. Функция инициализации инициализирует состояние, в котором работают сгенерированные функции точки входа C/C + +. Его необходимо вызвать перед первым вызовом функций точки входа. Функция завершения освобождает выделенную память и выполняет другие операции очистки. Его необходимо вызвать после последнего вызова функций точки входа.
Имя созданной функции инициализации primary_function_name_initialize, где primary_function_name - имя первой функции точки входа MATLAB, указанное при создании кода. Функция инициализации инициализирует состояние, в котором работают сгенерированные функции точки входа. Функция инициализации может включать в себя:
Вызовы поддерживающего кода для нефинитных данных (Inf и NaN). Эти вызовы генерируются, если код MATLAB содержит операции, которые могут генерировать нефиксированные значения.
Код, инициализирующий global или persistent переменные.
Пользовательский код для создания указанного начального состояния. Чтобы включить пользовательский код в функцию инициализации, выполните одно из следующих действий.
В объекте конфигурации кода установите CustomInitializer к вектору символов, содержащему пользовательский код.
В приложении MATLAB Coder™ на вкладке Пользовательский код укажите пользовательский код для функции инициализации.
В некоторых ситуациях код инициализации не требуется, и сгенерированная функция инициализации пуста.
При создании функции MEX сгенерированный код автоматически включает вызов функции инициализации. При создании автономного кода возможны две ситуации:
По умолчанию, если функция инициализации не является пустой, генератор кода включает вызов функции инициализации в начале сгенерированных C/C + + входных функций. Созданный код также включает в себя проверки, чтобы убедиться, что функция инициализации вызывается автоматически только один раз, даже если существует несколько функций точки входа. В этой ситуации нет необходимости вызывать функцию инициализации вручную.
Если функция инициализации пуста, сгенерированные функции точки входа C/C + + не включают вызов функции инициализации.
Можно не включать вызов функции инициализации в созданные функции точки входа. Выполните одно из следующих действий:
В coder.CodeConfig или coder.EmbeddedCodeConfig объект, установка RunInitializeFcn кому false.
В приложении Кодер MATLAB на вкладке Все настройки установите параметр Автоматически запускать функцию инициализации в значение No.
При выборе этого варианта перед первым вызовом сгенерированной функции точки входа необходимо вручную вызвать функцию инициализации. Отсутствие вызова функции инициализации приводит к тому, что созданные функции точки входа работают в недопустимом состоянии.
При генерации кода C++ с интерфейсом класса генератор кода создает конструктор класса и деструктор, выполняющие операции инициализации и завершения. Нет необходимости вызывать вручную initialize и terminate функции. См. раздел Создание кода C++ с интерфейсом класса.
Примеры шаблонов кода 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 - папка, содержащая workbar.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 - папка, содержащая workfoo.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 на вкладке Пользовательский код укажите пользовательский код для функции завершения.
При создании функции 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 - папка, содержащая workbar.m. Функция bar_terminate устанавливает логическое значение isInitialized_bar (для которого было установлено значение true после вызова функции инициализации) false.
void bar_terminate(void)
{
isInitialized_bar = false;
}
coder.CodeConfig | coder.EmbeddedCodeConfig | coder.MexCodeConfig