|
Размер стека |
|
|
|
Feb 20 2007, 15:28
|

Их либе дих ...
     
Группа: СуперМодераторы
Сообщений: 2 010
Регистрация: 6-09-04
Из: Russia, Izhevsk
Пользователь №: 609

|
Собственно, надоело мне размер стека на шару выставлять. Посоветуйте плиз как это делать наиболее "разумно". Залез в Keil-овский репорт, там первой строкой (надо полагать нихудший случай): Код Maximum Stack Usage = 584 bytes + Unknown(Functions without stacksize,Cycles,Untraceable Function Pointers) Не совсем доганяю, что значит вторая часть слагаемого? Еще, как то можно его (стек) во время работы измерять? Например, под microblaze есть функция которая выполняется в случае переполнения стека, полагаю подобное есть в любой среде?
--------------------
Усы, борода и кеды - вот мои документы :)
|
|
|
|
|
 |
Ответов
(1 - 7)
|
Feb 20 2007, 19:41
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(3.14 @ Feb 20 2007, 15:28)  Например, под microblaze есть функция которая выполняется в случае переполнения стека, полагаю подобное есть в любой среде? Такую функцию сделать и самому не сложно. Оформить в качестве макроса и вставлять в самые дальние функции в дереве вызовов. Таких, как правило, не много. Кстати, попутно и у меня возник вопрос - есть-ли в природе для arm-elf-gcc свободные программы для анализа и оценки максимального значения используемого стека? Вопрос далеко не праздный - искал, но ничего толкового не попалось.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Feb 21 2007, 08:20
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(3.14 @ Feb 21 2007, 00:07)  Код Такую функцию сделать и самому не сложно... Моих познаний для этого не достаточно. Я все-таки думаю, что достаточно.  Такая функция должна делать всего две вещи в первом приближении: получать текущее значение SP и сравнивать его c константой - пределом стека. Если перешли - значит ошибка. Как с помощью ассемблерной вставки прочитать SP, думаю, разобраться не сложно. Что же касается вышеупомянутой константы - ее можно либо объявить с помощью скрипта линкера (экспортировать символ-указатель на нижнюю границу стека), либо иным доступным способом. Сложнее сделать backtrace, но тоже вполне реально. Тем более, что у компиляторов есть возможность генерирования стековых фреймов в соответствии со стандартом APCS.  Цитата(scifi @ Feb 21 2007, 03:41)  Есть один простой способ, хотя и не идеальный. При запуске программы область стека инициализируется известными данными (например, 0x12345678). Затем программу гоняют, стараясь заставить её использовать стек по максимуму. После этого смотрят в облась стека и видят, сколько было затёрто (данные не равны 0x12345678). Да уж, от идеала далеко... Как часто нужно запускать процедуру контроля? К тому же при переполнении стека программа может уже не вернуться в основную свою ветку, где происходит проверка. Так что этот способ лично мне видится совершенно бесполезным.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Feb 21 2007, 10:29
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(makc @ Feb 21 2007, 07:20)  Да уж, от идеала далеко... Отнюдь  Цитата Как часто нужно запускать процедуру контроля?  Например - раз в неделю, ибо частота контроля для данного механизма не принципиальна совсем. Цитата К тому же при переполнении стека программа может уже не вернуться в основную свою ветку, где происходит проверка. Это исследовательский способ и в простейшем случае для начала стек берется с явным запасом. Но а если 'вдруг', то будет, например, exception - там в обработчине и посмотрите а хватило-ли стека?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|