Управление использованием пространства стека

Можно управлять максимальным размером стека, используемым компилятором или оборудованием. Стек является блоком памяти, который хранит локальные переменные для выполнения программы. Память стека выделяется во время генерации кода. Выделение стека обычно более эффективно для использования памяти, чем статическое выделение.

Значение настройки строения StackUsageMax измеряется в байтах. Основываясь на информации из целевых компьютеров и возможных путей выполнения в коде, программное обеспечение оценивает переменные стека, которые имеют определенное значение StackUsageMax может разместить. Эта оценка не учитывает изменения размера стека, внесенные компилятором C. Переменные, которые не помещаются в памяти стека, разливаются из стека. Если вы пытаетесь сгенерировать входной код, переменные, которые разливаются из стека, хранятся в статической памяти или в структуре разлива.

  • Можно увеличить StackUsageMax увеличение количества переменных, выделенных в память стека. Если ваш целевой компьютер имеет достаточное пространство стека, это уменьшает количество переменных, которые разливаются из стека.

  • Можно уменьшить StackUsageMax чтобы уменьшить количество переменных, выделенных в стековой памяти. Если ваш целевой компьютер не хватает достаточного пространства в стеке, это увеличивает количество переменных, которые разливаются из стека.

Переменные в рекурсивных функциях, которые не могли поместиться в стеке, не хранятся в статической памяти или в структуре разлива, если вы генерируете повторяющийся код. Переменные в рекурсивных функциях не разливаются из стека, даже если они превышают размер использования стека.

Точно так же генерация кода не учитывает использование стека пользовательского кода в вызовах coder.ceval.

В этом примере показано, как задать максимальное пространство стека, которое использует сгенерированный код. Установите максимальное использование стека, когда:

  • У вас ограниченное пространство стека, например, во целевых процессорах.

  • Компилятор C сообщает о переполнении стека во время выполнения.

Управление использованием пространства стека при помощи приложения MATLAB Coder

  1. Чтобы открыть диалоговое окно Generate, на странице Generate Code щелкните стрелу Generate.

  2. Установите Build type значение Source Code, MEX, Static Library, Dynamic Library, или Executable (в зависимости от ваших требований).

  3. Нажмите More Settings.

  4. На вкладке Memory установите Stack usage max требуемое значение.

Управление использованием пространства стека в командной строке

  1. Создайте объект строения для генерации кода.

    Использовать coder.config с аргументами 'lib', mex, 'dll', или 'exe' (в зависимости от ваших требований). Для примера:

    cfg = coder.config('lib');
  2. Установите свойство 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;

Похожие темы