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