реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> задание размера стеков, как узнать какой размер стэка нужно задавать
poq12
сообщение Sep 2 2009, 20:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 20-05-08
Из: Санкт-Петербург
Пользователь №: 37 681



Четкого ответа на данный вопрос я для себя найти не смог, поэтому решил задать его здесь. Собственно вопрос:
(использую LPC2148, среда Uvision3, компилятор RealView)
Я продумал алгоритм как должна работать программа, чтобы железо выполняло желаемые действия, написал её, скомпилировал, зашил в процессор - все работет, претензий нет. Впроцессе написания нужно задать размер стэков для разных режимов работы процессора в файле "startup.s", в частности например, режимов "supervisor mode" - 8bytes, "interrupt mode"- 80 bytes, "user/system mode" - 400bytes. Количество отводимых байт я брал "от балды" исходя из того сколько указано в идущих примерах.
Теперь сам вопрос - как узнать сколько байт для стэка нужно выделять данным режимам, с чего например брать 400, а не 300 ... и так и так будет работать ... Как узнать сколько байт под стэк нужно выделить, чтобы и мало не было и слишком много не дать ... smile3046.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 2 2009, 20:41
Сообщение #2


Гуру
******

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



Цитата(poq12 @ Sep 2 2009, 23:10) *
Четкого ответа на данный вопрос я для себя найти не смог....

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Sep 2 2009, 21:09
Сообщение #3





Guests






Можно попытаться найти "наихудший случай" (для стека) - то есть такое сочетание вызовов и возможных прерываний, при котором стек будет использован максимально. Иногда это получается.
Есть еще "экспериментальный" способ. Задаете стек с большим запасом. В начале работы программы заполняете всю область стека известными значениями (нулями, например). Даете поработать программе какое-то время на различных режимах, и затем смотрите - какая часть стека оказалась "затертой" (была использована).
Go to the top of the page
 
+Quote Post
poq12
сообщение Sep 4 2009, 19:28
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 20-05-08
Из: Санкт-Петербург
Пользователь №: 37 681



Спасибо за ответы smile.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 13 2010, 14:08
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Как расположить стек по заданному адресу?
Когда я задаю в свойствах проекта, что будет внешняя ОЗУ по адресам 0x64000000...0x40000, __initial_sp становится равным 0x64000400.
Ну а дальше в определенный момент вываливается HardFault (это потом буду исследовать).
Вручную в startup задать __initial_sp 0x20000400?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2010, 14:15
Сообщение #6


Гуру
******

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



Цитата(ViKo @ May 13 2010, 17:08) *
Когда я задаю в свойствах проекта...

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 13 2010, 14:43
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ May 13 2010, 17:15) *
Болванки образчики тоже есть.

Так дайте мне какую-нибудь болванку smile.gif
Если не трудно.
upd. В тех scatter-файлах, что я вижу в хэлпе, не нахожу упоминания стека.

Что непонятно - в файле startup_stm32f10x_hd.s вижу стек по адресу 0x20000400.
Как запускаю симулятор - загружается 0x64000400.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2010, 15:26
Сообщение #8


Гуру
******

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



Цитата(ViKo @ May 13 2010, 17:43) *
Так дайте мне какую-нибудь болванку smile.gif

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 13 2010, 17:30
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Я конкретно не указывал стек, иначе зачем бы я вопрос задавал.
Как только указал в настройках, что есть внешняя память, и отметил птички default и noinit, так он сам туда переназначается. В симуляторе вижу R13(SP)=0x64000400.
Убрал птичку default с адресов 0x64000000... - стек стал таким, как надо. Похоже, с этой бедой я "справился" smile.gif
За файлик - спасибо!

А что ж тогда эта птичка default делает?
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2010, 17:43
Сообщение #10


Гуру
******

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



Цитата(ViKo @ May 13 2010, 20:30) *
А что ж тогда эта птичка default делает?

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 13 2010, 18:11
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ May 13 2010, 20:43) *
Верите, но отродясь во всякие визардики с галочками не заходил, посему не знаю и знать не хочу.

То - не визард, а опции для проекта, закладка Target. В другие закладки Вы же заходили, процессор выбирали, отладчик выбирали, оптимизацию...?
А, Вы же в IAR работаете...
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2010, 18:20
Сообщение #12


Гуру
******

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



Цитата(ViKo @ May 13 2010, 21:11) *
В другие закладки Вы же заходили

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



Цитата(ViKo @ May 13 2010, 21:11) *
То - не визард

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 13 2010, 18:29
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(zltigo @ May 13 2010, 21:20) *
Зачем. если есть отработанный и отполированный и, что самое главное ДОКУМЕНТИРОВАННЫЙ интерфейс командной строки? В IDE захожу дабы собрать покрутить какие-либо образчики чужих проектов. И все. Но даже в IDE есть возможность подсовывать вой скрипт и
работать не с мутными галочками а с параметрами командной строки.

Это вопрос личных предпочтений. А на этапе освоения визард - самый легкий путь. Но не всегда кратчайший.
Я вот связался с библиотекой от ST, теперь ноги разъезжаются, не знаю где глюки искать, или какую еще функцию не вызвал. Но "на переправе коней не меняют". Заработает - начну с нуля, все свое писать.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 15 2010, 20:10
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



По поводу размера стека поделюсь информацией.
Был у меня стек 0x0400, как, собственно, и стоял в startup. Думал я, зачем столько? Потом смотрю в симуляторе - осталось 0x040 примерно. Оказывается, когда инициализировал контроллер ЖКИ, висящий на внешней шине, процессор перенес массив констант для инициализации из флэш-памяти в стек, а уж потом оттуда по-быстрому забросил в контроллер ЖКИ. Кто бы мог подумать? smile.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 15 2010, 20:14
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ May 16 2010, 00:10) *
Кто бы мог подумать? smile.gif

Писатель должен был подумать, вообще-то. В стек компилятор просто так ничего не упихивает, если его не попросить.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 02:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016