Можно управлять максимальным размером стека, используемым компилятором или оборудованием. Стек является блоком памяти, которая хранит локальные переменные для выполнения программы. Стековая память выделяется во время генерации кода. Выделение стека обычно более эффективно для использования памяти, чем статическое выделение.
Значение параметра конфигурации 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
- 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;