Перейти к содержанию

    

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Четкого ответа на данный вопрос я для себя найти не смог....

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость @Ark

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Когда я задаю в свойствах проекта...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Болванки образчики тоже есть.

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Так дайте мне какую-нибудь болванку :)

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

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

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

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

Startup_Link_Cortex_M3.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А что ж тогда эта птичка default делает?

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

Поделиться сообщением


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В другие закладки Вы же заходили

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

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

 

 

 

То - не визард

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

Поделиться сообщением


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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Кто бы мог подумать? :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация