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