Jump to content

    

задание размера стеков

Четкого ответа на данный вопрос я для себя найти не смог, поэтому решил задать его здесь. Собственно вопрос:

(использую LPC2148, среда Uvision3, компилятор RealView)

Я продумал алгоритм как должна работать программа, чтобы железо выполняло желаемые действия, написал её, скомпилировал, зашил в процессор - все работет, претензий нет. Впроцессе написания нужно задать размер стэков для разных режимов работы процессора в файле "startup.s", в частности например, режимов "supervisor mode" - 8bytes, "interrupt mode"- 80 bytes, "user/system mode" - 400bytes. Количество отводимых байт я брал "от балды" исходя из того сколько указано в идущих примерах.

Теперь сам вопрос - как узнать сколько байт для стэка нужно выделять данным режимам, с чего например брать 400, а не 300 ... и так и так будет работать ... Как узнать сколько байт под стэк нужно выделить, чтобы и мало не было и слишком много не дать ... :smile3046:

Share this post


Link to post
Share on other sites
Четкого ответа на данный вопрос я для себя найти не смог....

Ну никто, кроме Вас на него и не ответит. Смотрите сами какие режимы используете, какие фунции вызываете.... В map/list файлах обычно бывает информация об использовании стека функциями. Прикидывайте, думайте.

Share this post


Link to post
Share on other sites
Guest @Ark

Можно попытаться найти "наихудший случай" (для стека) - то есть такое сочетание вызовов и возможных прерываний, при котором стек будет использован максимально. Иногда это получается.

Есть еще "экспериментальный" способ. Задаете стек с большим запасом. В начале работы программы заполняете всю область стека известными значениями (нулями, например). Даете поработать программе какое-то время на различных режимах, и затем смотрите - какая часть стека оказалась "затертой" (была использована).

Share this post


Link to post
Share on other sites

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

Когда я задаю в свойствах проекта, что будет внешняя ОЗУ по адресам 0x64000000...0x40000, __initial_sp становится равным 0x64000400.

Ну а дальше в определенный момент вываливается HardFault (это потом буду исследовать).

Вручную в startup задать __initial_sp 0x20000400?

Share this post


Link to post
Share on other sites
Когда я задаю в свойствах проекта...

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

Share this post


Link to post
Share on other sites
Болванки образчики тоже есть.

Так дайте мне какую-нибудь болванку :)

Если не трудно.

upd. В тех scatter-файлах, что я вижу в хэлпе, не нахожу упоминания стека.

 

Что непонятно - в файле startup_stm32f10x_hd.s вижу стек по адресу 0x20000400.

Как запускаю симулятор - загружается 0x64000400.

Share this post


Link to post
Share on other sites
Так дайте мне какую-нибудь болванку :)

Легко. У меня сейчас пока такая болванка IAR V5 для Сortex-M3, но Luminary, что совершенно не принципиально - только старшую часть таблицы векторов в соответствие с таблицей другого производителя подправить и все. Стек просто размещается в noinit секции, но естествено можно создать линкером и свою в желаемом месте.

Что непонятно - в файле startup_stm32f10x_hd.s вижу стек по адресу 0x20000400.

Как запускаю симулятор - загружается 0x64000400.

А с чего Вы решили, что у Вас именно он используется? Его конкретно в проект запихнули? В том, что у Вас явно он уже в библиотеке скомпилированная и указатель на стек линкером из *.icf берется. Вообще, если в каком-то startup есть явное указателя на стек, то это явный дибилизм - ликер об этом не знает и спокойно когда-нибудь туда память распределит :(. Конечно,можно какую-то область памяти у линкера забрать, но тогда придется согласовывать числа в startup и линкере. Зачем?

Startup_Link_Cortex_M3.rar

Share this post


Link to post
Share on other sites

Я конкретно не указывал стек, иначе зачем бы я вопрос задавал.

Как только указал в настройках, что есть внешняя память, и отметил птички default и noinit, так он сам туда переназначается. В симуляторе вижу R13(SP)=0x64000400.

Убрал птичку default с адресов 0x64000000... - стек стал таким, как надо. Похоже, с этой бедой я "справился" :)

За файлик - спасибо!

 

А что ж тогда эта птичка default делает?

Share this post


Link to post
Share on other sites
А что ж тогда эта птичка default делает?

Верите, но отродясь во всякие визардики с галочками не заходил, посему не знаю и знать не хочу.

Share this post


Link to post
Share on other sites
Верите, но отродясь во всякие визардики с галочками не заходил, посему не знаю и знать не хочу.

То - не визард, а опции для проекта, закладка Target. В другие закладки Вы же заходили, процессор выбирали, отладчик выбирали, оптимизацию...?

А, Вы же в IAR работаете...

Share this post


Link to post
Share on other sites
В другие закладки Вы же заходили

Зачем. если есть отработанный и отполированный и, что самое главное ДОКУМЕНТИРОВАННЫЙ интерфейс командной строки? В IDE захожу дабы собрать покрутить какие-либо образчики чужих проектов. И все. Но даже в IDE есть возможность подсовывать вой скрипт и

работать не с мутными галочками а с параметрами командной строки.

 

 

 

То - не визард

Визард и есть - вместо нормального управления несколько готовых рецептов - пипл хавает :(

Share this post


Link to post
Share on other sites
Зачем. если есть отработанный и отполированный и, что самое главное ДОКУМЕНТИРОВАННЫЙ интерфейс командной строки? В IDE захожу дабы собрать покрутить какие-либо образчики чужих проектов. И все. Но даже в IDE есть возможность подсовывать вой скрипт и

работать не с мутными галочками а с параметрами командной строки.

Это вопрос личных предпочтений. А на этапе освоения визард - самый легкий путь. Но не всегда кратчайший.

Я вот связался с библиотекой от ST, теперь ноги разъезжаются, не знаю где глюки искать, или какую еще функцию не вызвал. Но "на переправе коней не меняют". Заработает - начну с нуля, все свое писать.

Share this post


Link to post
Share on other sites

По поводу размера стека поделюсь информацией.

Был у меня стек 0x0400, как, собственно, и стоял в startup. Думал я, зачем столько? Потом смотрю в симуляторе - осталось 0x040 примерно. Оказывается, когда инициализировал контроллер ЖКИ, висящий на внешней шине, процессор перенес массив констант для инициализации из флэш-памяти в стек, а уж потом оттуда по-быстрому забросил в контроллер ЖКИ. Кто бы мог подумать? :)

Share this post


Link to post
Share on other sites
Кто бы мог подумать? :)

Писатель должен был подумать, вообще-то. В стек компилятор просто так ничего не упихивает, если его не попросить.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this