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

Когда я даю компилятору Keil параметр «--callgraph», он статически вычисляет для меня точное «Максимальное использование стека».

Увы, сегодня он дает мне «Максимальное использование стека = 284 байта + неизвестно (Функции без размера стека ...)"сообщение вместе со списком" Функции без информации о стеке ".

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

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

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

Я подозреваю, что программа, которая обрабатывает --callgraph, запуталась с небольшими функциями языка ассемблера в списке «Функции без информации о стеке». Документация - callgraph , кажется, подразумевает, что мне нужно вручную вычислить (или сделать консервативную оценку), сколько стека они используют - они очень короткие, так что это должно быть просто - а затем " Используйте директивы кадра в коде на языке ассемблера, чтобы описать, как ваш код использует стек ». Один из них - это начальный код запуска, который сбрасывает стек до нуля перед переходом к main () - так что фактически он потребляет нулевой стек. Другой - обработчик прерывания "Fault", который замыкается в бесконечном цикле до тех пор, пока я не отключу питание - можно с уверенностью предположить, что он потребляет нулевой стек.

Я использую Keil uVision V4.20.03.0 для компиляции кода для LM3S1968 ARM Cortex-M3.

Итак, как мне использовать «директивы кадра», чтобы сообщить программе, которая обрабатывает «--callgraph», сколько стека используют эти функции? Или есть лучший подход для определения максимального использования стека?

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

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