Я пишу код запуска для встроенной системы - код, который загружает указатель начального стека, перед тем как перейти к функции main(), и мне нужно сказать, сколько байтов в стеке будет использоваться моим приложением (или несколько больше, скромный подсчет).
Мне сказали, что в gcc-компиляторе теперь есть опция -fstack-usage и опция -fcallgraph-info, которая может каким-то образом использоваться для статического вычисления точного "максимального использования стека" для меня. ("Анализ требований к суммарному времени стека с GCC" от Botcazou, Comar и Hainque).
Найджел Джонс говорит, что рекурсия - очень плохая идея во встроенных системах ("Вычисление размера стека" 2009), поэтому я старался не делать никаких взаимно рекурсивных функций в этом коде.
Кроме того, я убеждаюсь, что ни один из моих обработчиков прерываний никогда не включал прерывания до их окончательной команды с возвратом из-прерывания, поэтому мне не нужно беспокоиться о обработчиках прерываний повторного входа.
Без рекурсивных или повторных обработчиков прерываний он должен статически определять максимальное использование стека. (И поэтому большинство ответов на вопрос " Как определить максимальное использование стека" не применяются). Мое понимание - это я (или, желательно, некоторый бит кода на моем ПК, который автоматически запускается каждый раз, когда я перестраиваю исполняемый файл), сначала набирает максимальную глубину стека для каждого обработчика прерываний, когда он не прерывается прерыванием с более высоким приоритетом, а максимальное глубина стека функции main(), если она не прерывается. Затем я добавляю их все, чтобы найти общую (наихудшую) максимальную глубину стека. Это происходит (в моей встроенной системе), когда основная() фоновая задача находится на максимальной глубине, когда она прерывается прерыванием с наименьшим приоритетом, и это прерывание находится на максимальной глубине, когда оно прерывается следующим самым низким приоритетом прерывание и т.д.
Я использую YAGARTO с gcc 4.6.0 для компиляции кода для LM3S1968 ARM Cortex-M3.
Итак, как использовать параметр -fstack-usage и -fcallgraph-info с gcc для вычисления максимальной глубины стека? Или существует какой-то лучший подход для определения максимального использования стека?
(См. Как определить максимальное использование стека во встроенной системе? Почти для того же вопроса, нацеленного на компилятор Keil.)