Можно управлять максимальным размером стека, используемым компилятором или аппаратным обеспечением. Стек - это блок памяти, хранящий локальные переменные для выполнения программы. Память стека выделяется во время генерации кода. Распределение стека обычно более эффективно для использования памяти, чем статическое распределение.
Значение параметра конфигурации StackUsageMax измеряется в байтах. На основе информации из настроек целевого аппаратного обеспечения и возможных путей выполнения в коде программное обеспечение оценивает переменные стека, которые имеют определенное значение StackUsageMax может вмещать. Эта оценка не учитывает изменения размера стека, внесенные компилятором C. Переменные, которые не помещаются в память стека, выливаются из стека. Переменные, которые выливаются из стека, сохраняются в статической памяти или в структуре разлива при попытке создать повторно вводимый код.
Вы можете увеличить StackUsageMax для увеличения количества переменных, выделенных памяти стека. Если на целевом оборудовании достаточно места для стека, это уменьшает количество переменных, которые выливаются из стека.
Можно уменьшить StackUsageMax для уменьшения количества переменных, выделенных памяти стека. Если целевому оборудованию не хватает места в стеке, это увеличивает количество переменных, которые выливаются из стека.
Переменные в рекурсивных функциях, которые не могут поместиться в стек, не сохраняются в статической памяти или в структуре разлива при создании исходного кода. Переменные в рекурсивных функциях не выливаются из стека, даже если они превышают размер использования стека.
Аналогично, создание кода не учитывает использование стека пользовательского кода при вызовах coder.ceval.
В этом примере показано, как задать максимальное пространство стека, используемое сгенерированным кодом. Установите максимальное использование стека при:
Пространство стека ограничено, например, во встроенных целевых объектах.
Компилятор C сообщает о переполнении стека во время выполнения.
Управление использованием пространства стека с помощью приложения кодера MATLAB
Управление использованием пространства стека в командной строке
Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».![]()
Задать для типа построения значение Source Code, MEX, Static Library, Dynamic Library, или Executable (в зависимости от ваших требований).
Щелкните Дополнительные параметры.
На вкладке «Память» задайте значение параметра «Максимальное использование стека».
Создайте объект конфигурации для создания кода.
Использовать coder.config с аргументами 'lib', mex,'dll', или 'exe' (в зависимости от ваших требований). Например:
cfg = coder.config('lib');Установка свойства StackUsageMax к нужному значению.
cfg.StackUsageMax=400000;
Различные результаты зависят от объема пространства стека.
При создании кода для следующего кода MATLAB ® с достаточным пространством стека генерируется следующий код:
function y = fooNorm(x) b = cast(x,'uint32'); y = sum(b); end
Вход в функцию fooNorm(x) является 100около-100 матрица единиц.
void fooNorm(const double x[10000], double y[100])
{
double d;
unsigned int b[10000];
...
}
static void main_fooNorm(void)
{
double dv[10000];
double y[100];
argInit_100x100_real_T(dv);
fooNorm(dv, y);
}fooNorm. Функция main_fooNorm объявляет переменную dv[10000] и y[100]на стеке, который является входом в функцию fooNorm.При создании кода для одного и того же кода MATLAB с недостаточным пространством стека используется следующий код:
void fooNorm(const double x[10000], double y[100])
{
static unsigned int b[10000];
double d;
...
}
static void main_fooNorm(void)
{
static double dv[10000];
static double y[100];
argInit_100x100_real_T(dv);
fooNorm(dv, y);
}b[10000], dv[10000], и y[100] объявлены как статические переменные, поскольку они не помещаются в стеке.При создании кода повторного ввода для того же кода MATLAB с недостаточным пространством стека создается следующий код:
void fooNorm(fooNormStackData *SD, const double x[10000], double y[100])
{
double d;
...
}
static void main_fooNorm(void)
{
static double dv[10000];
static double y[100];
argInit_100x100_real_T(dv);
fooNorm(&fooNormStackDataGlobal, dv, y);
}
fooNorm - структура fooNormStackData. При создании исходного кода, когда переменные вытекают из стека, создается структура разлива, которая содержит переменные, которые не помещаются в стеке.Структура fooNormStackData определяется как:
typedef struct {
struct {
unsigned int b[10000];
} f0;
} fooNormStackData;