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

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

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

(использую 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 примерно. Оказывается, когда инициализировал контроллер ЖКИ, висящий на внешней шине, процессор перенес массив констант для инициализации из флэш-памяти в стек, а уж потом оттуда по-быстрому забросил в контроллер ЖКИ. Кто бы мог подумать? :)

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


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

Кто бы мог подумать? :)

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...