Можно управлять максимальным размером стека, используемым компилятором или оборудованием. Стек является блоком памяти, который хранит локальные переменные для выполнения программы. Память стека выделяется во время генерации кода. Выделение стека обычно более эффективно для использования памяти, чем статическое выделение.
Значение настройки строения StackUsageMax
измеряется в байтах. Основываясь на информации из целевых компьютеров и возможных путей выполнения в коде, программное обеспечение оценивает переменные стека, которые имеют определенное значение StackUsageMax
может разместить. Эта оценка не учитывает изменения размера стека, внесенные компилятором C. Переменные, которые не помещаются в памяти стека, разливаются из стека. Если вы пытаетесь сгенерировать входной код, переменные, которые разливаются из стека, хранятся в статической памяти или в структуре разлива.
Можно увеличить StackUsageMax
увеличение количества переменных, выделенных в память стека. Если ваш целевой компьютер имеет достаточное пространство стека, это уменьшает количество переменных, которые разливаются из стека.
Можно уменьшить StackUsageMax
чтобы уменьшить количество переменных, выделенных в стековой памяти. Если ваш целевой компьютер не хватает достаточного пространства в стеке, это увеличивает количество переменных, которые разливаются из стека.
Переменные в рекурсивных функциях, которые не могли поместиться в стеке, не хранятся в статической памяти или в структуре разлива, если вы генерируете повторяющийся код. Переменные в рекурсивных функциях не разливаются из стека, даже если они превышают размер использования стека.
Точно так же генерация кода не учитывает использование стека пользовательского кода в вызовах coder.ceval
.
В этом примере показано, как задать максимальное пространство стека, которое использует сгенерированный код. Установите максимальное использование стека, когда:
У вас ограниченное пространство стека, например, во целевых процессорах.
Компилятор C сообщает о переполнении стека во время выполнения.
Управление использованием пространства стека при помощи приложения MATLAB Coder
Управление использованием пространства стека в командной строке
Сгенерированный входящий код, который имеет разлитые переменные
Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.
Установите Build type значение Source Code
, MEX
, Static Library
, Dynamic Library
, или Executable
(в зависимости от ваших требований).
Нажмите More Settings.
На вкладке Memory установите Stack usage max требуемое значение.
Создайте объект строения для генерации кода.
Использовать 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
-by- 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;