Как определить максимальное использование стека во встроенной системе с помощью gcc?

Я пишу код запуска для встроенной системы - код, который загружает начальный указатель стека перед переходом к функции main () - и мне нужно сказать ему, сколько байтов стека будет использовать мое приложение (или какая-то большая, консервативная оценка).

Мне сказали у компилятора gcc теперь есть опция -fstack-usage и -fcallgraph-info, которые можно каким-то образом использовать для статического вычисления e xact "Максимальное использование стека" для меня. ( «Анализ требований стека во время компиляции с помощью GCC» Ботказу, Комар и Хайнке).

Найджел Джонс говорит, что рекурсия - действительно плохая идея для встроенных систем («Вычисление размера вашего стека», 2009 ), поэтому я старался не выполнять в этом коде какие-либо взаимно рекурсивные функции.

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

Без рекурсии или обработчиков прерываний с повторным входом должно быть возможно статическое определение максимального использования стека. (И поэтому большинство ответов на Как определить максимальное использование стека? не применимы). Насколько я понимаю, я (или, желательно, некоторый бит кода на моем ПК, который автоматически запускается каждый раз, когда я перестраиваю исполняемый файл) сначала нахожу максимальную глубину стека для каждого обработчика прерывания, когда он не прерывается прерыванием с более высоким приоритетом, и максимальный глубина стека функции main (), когда она не прерывается. Затем я складываю их все, чтобы найти общую (в худшем случае) максимальную глубину стека. Это происходит (в моей встроенной системе), когда фоновая задача main () находится на максимальной глубине, когда она прерывается прерыванием с самым низким приоритетом, и это прерывание находится на максимальной глубине, когда оно прерывается следующим с низким приоритетом прерывание и т. д.

Я использую YAGARTO с gcc 4.6.0 для компиляции кода для LM3S1968 ARM Cortex-M3.

Итак, как мне использовать параметр -fstack-usage и -fcallgraph-info с помощью gcc для расчета максимальной глубины стека? Или есть лучший подход для определения максимального использования стека?

(См. Как определить максимальное использование стека во встроенной системе? почти тот же вопрос, адресованный компилятору Keil.)

38
задан Community 23 May 2017 в 10:30
поделиться