При генерации автономного кода из MATLAB® код, вы принимаете решение не генерировать функцию initialize:
В coder.EmbeddedCodeConfig объект, IncludeInitializeFcn установлено в false.
Кроме того, в приложении MATLAB Coder™, на вкладке All Settings, Initialize Function Required установлено на No.
Кроме того, вы гарантируете, что пользовательский код, который появится в сгенерированной функции инициализации, пуст:
В coder.EmbeddedCodeConfig объект, CustomInitializer установлено в ''.
Кроме того, в приложении MATLAB Coder, на вкладке Custom Code, Custom C Code for Generated Files для инициализации функции пуста.
Вы по-прежнему получаете это сообщение об ошибке:
The initialize function is not empty, but the IncludeInitializeFcn configuration setting requests that the initialize function be omitted.
В определенных ситуациях генератор кода определяет, что функция инициализации должна быть непустой, и производит код для функции инициализации. Эта генерация кода может произойти, даже если пользовательский код для заданной вами функции инициализации пуст. Отсутствие этого сгенерированного кода в функции инициализации заставляет сгенерированные функции точки входа работать в недопустимом состоянии. В таких ситуациях, если вы принимаете решение не генерировать функцию initialize, генератор кода выдает сообщение об ошибке.
Чтобы устранить эту проблему, включите функцию initialize в свой сгенерированный код, выполнив одно из следующих действий:
В coder.EmbeddedCodeConfig объект, задать IncludeInitializeFcn на true (это значение является значением по умолчанию).
В приложении MATLAB Coder на вкладке All Settings установите значение Initialize Function Required Yes (этот параметр является настройкой по умолчанию).
Примерами шаблонов кода MATLAB, которые требуют непустой функции инициализации в сгенерированном коде, являются:
Ваш код MATLAB содержит операцию, которая может сгенерировать нефинитные значения (Inf или NaN). Для примера задайте функцию MATLAB foo который вызывает factorial. The factorial функция быстро растет и возвращается Inf для входов, больше определенного порога. Для входа типа double, порог 170. Выполнение factorial(171) в MATLAB возвращает Inf.
function y = foo(a) y = factorial(a); end
Сгенерируйте статическую библиотеку для foo. В coder.EmbeddedCodeConfig cfg объекта, установите параметр CustomInitializer в пустой символьный массив. Установите параметр IncludeInitializeFcn на true. Эти значения являются значениями по умолчанию для параметров.
cfg = coder.config('lib'); cfg.CustomInitializer = ''; %These are the default values cfg.IncludeInitializeFcn = true; codegen -config cfg foo -args {1}
Генератор кода автоматически производит непустую функцию инициализации foo_initialize который вызывает вспомогательный код для нефинитных данных. Эта функция вызывает rt_InitInfAndNaN, который задан в другом сгенерированном файле rt_nonfinite.c.
/* Include Files */
#include "foo_initialize.h"
#include "foo.h"
#include "foo_data.h"
#include "rt_nonfinite.h"
/* Function Definitions */
/*
* Arguments : void
* Return Type : void
*/
void foo_initialize(void)
{
rt_InitInfAndNaN();
isInitialized_foo = true;
}
/*
* File trailer for foo_initialize.c
*
* [EOF]
*/Ваш код MATLAB использует global или persistent переменные. Для примера задайте эту функцию MATLAB:
function y = bar global g y = g; end
Сгенерируйте статическую библиотеку для bar. Задайте начальное значение g как 1. В coder.EmbeddedCodeConfig cfg объекта, установите параметр CustomInitializer в пустой символьный массив. Установите параметр IncludeInitializeFcn на true. Эти значения являются значениями по умолчанию для параметров.
cfg = coder.config('lib'); cfg.CustomInitializer = ''; %These are the default values cfg.IncludeInitializeFcn = true; codegen -config cfg -globals {'g',1} bar
Генератор кода автоматически производит непустую функцию инициализации bar_initialize который инициализирует g.
/* Include Files */
#include "bar_initialize.h"
#include "bar.h"
#include "bar_data.h"
/* Function Definitions */
/*
* Arguments : void
* Return Type : void
*/
void bar_initialize(void)
{
g = 1.0;
isInitialized_bar = true;
}
/*
* File trailer for bar_initialize.c
*
* [EOF]
*/