Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размер стека
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
3.14
Собственно, надоело мне размер стека на шару выставлять.
Посоветуйте плиз как это делать наиболее "разумно".
Залез в Keil-овский репорт, там первой строкой (надо полагать нихудший случай):
Код
Maximum Stack Usage = 584 bytes + Unknown(Functions without stacksize,Cycles,Untraceable Function Pointers)
Не совсем доганяю, что значит вторая часть слагаемого?
Еще, как то можно его (стек) во время работы измерять?
Например, под microblaze есть функция которая выполняется в случае переполнения стека, полагаю подобное есть в любой среде?
SpiritDance
Цитата(3.14 @ Feb 20 2007, 15:28) *
Не совсем доганяю, что значит вторая часть слагаемого?


callback - вызовы через указатели на функции, возможно присутствующие в программе.
makc
Цитата(3.14 @ Feb 20 2007, 15:28) *
Например, под microblaze есть функция которая выполняется в случае переполнения стека, полагаю подобное есть в любой среде?


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

Кстати, попутно и у меня возник вопрос - есть-ли в природе для arm-elf-gcc свободные программы для анализа и оценки максимального значения используемого стека? Вопрос далеко не праздный - искал, но ничего толкового не попалось.
3.14
Код
Такую функцию сделать и самому не сложно...
Моих познаний для этого не достаточно.
scifi
Цитата(3.14 @ Feb 20 2007, 15:28) *
Собственно, надоело мне размер стека на шару выставлять.
Посоветуйте плиз как это делать наиболее "разумно".


Есть один простой способ, хотя и не идеальный. При запуске программы область стека инициализируется известными данными (например, 0x12345678). Затем программу гоняют, стараясь заставить её использовать стек по максимуму. После этого смотрят в облась стека и видят, сколько было затёрто (данные не равны 0x12345678).
makc
Цитата(3.14 @ Feb 21 2007, 00:07) *
Код
Такую функцию сделать и самому не сложно...
Моих познаний для этого не достаточно.


Я все-таки думаю, что достаточно. smile.gif
Такая функция должна делать всего две вещи в первом приближении: получать текущее значение SP и сравнивать его c константой - пределом стека. Если перешли - значит ошибка.

Как с помощью ассемблерной вставки прочитать SP, думаю, разобраться не сложно. Что же касается вышеупомянутой константы - ее можно либо объявить с помощью скрипта линкера (экспортировать символ-указатель на нижнюю границу стека), либо иным доступным способом.

Сложнее сделать backtrace, но тоже вполне реально. Тем более, что у компиляторов есть возможность генерирования стековых фреймов в соответствии со стандартом APCS. smile.gif


Цитата(scifi @ Feb 21 2007, 03:41) *
Есть один простой способ, хотя и не идеальный. При запуске программы область стека инициализируется известными данными (например, 0x12345678). Затем программу гоняют, стараясь заставить её использовать стек по максимуму. После этого смотрят в облась стека и видят, сколько было затёрто (данные не равны 0x12345678).


Да уж, от идеала далеко... Как часто нужно запускать процедуру контроля? glare.gif
К тому же при переполнении стека программа может уже не вернуться в основную свою ветку, где происходит проверка. Так что этот способ лично мне видится совершенно бесполезным.
zltigo
Цитата(makc @ Feb 21 2007, 07:20) *
Да уж, от идеала далеко...

Отнюдь smile.gif
Цитата
Как часто нужно запускать процедуру контроля? glare.gif

Например - раз в неделю, ибо частота контроля для данного механизма не принципиальна совсем.
Цитата
К тому же при переполнении стека программа может уже не вернуться в основную свою ветку, где происходит проверка.

Это исследовательский способ и в простейшем случае для начала стек берется с явным запасом.
Но а если 'вдруг', то будет, например, exception - там в обработчине и посмотрите а хватило-ли стека?
makc
С моей точки зрения наличие такого механизма в релизе (в финальной версии прошивки) избыточно. Т.к. перед релизом необходимо выполнить тестирование всех функций и только потом - релиз. Т.е. мне нужен контроль стека лишь на этапе разработки программы, а не после начала ее использования, поскольку потом уже будет поздно что-то менять.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.