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

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

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

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

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

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

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

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

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

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

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

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

  2. Установите Build type на Source CodeMEX, 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- 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;

Похожие темы