poq12 0 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба Четкого ответа на данный вопрос я для себя найти не смог, поэтому решил задать его здесь. Собственно вопрос: (использую LPC2148, среда Uvision3, компилятор RealView) Я продумал алгоритм как должна работать программа, чтобы железо выполняло желаемые действия, написал её, скомпилировал, зашил в процессор - все работет, претензий нет. Впроцессе написания нужно задать размер стэков для разных режимов работы процессора в файле "startup.s", в частности например, режимов "supervisor mode" - 8bytes, "interrupt mode"- 80 bytes, "user/system mode" - 400bytes. Количество отводимых байт я брал "от балды" исходя из того сколько указано в идущих примерах. Теперь сам вопрос - как узнать сколько байт для стэка нужно выделять данным режимам, с чего например брать 400, а не 300 ... и так и так будет работать ... Как узнать сколько байт под стэк нужно выделить, чтобы и мало не было и слишком много не дать ... :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба Четкого ответа на данный вопрос я для себя найти не смог.... Ну никто, кроме Вас на него и не ответит. Смотрите сами какие режимы используете, какие фунции вызываете.... В map/list файлах обычно бывает информация об использовании стека функциями. Прикидывайте, думайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость @Ark 2 сентября, 2009 Опубликовано 2 сентября, 2009 · Жалоба Можно попытаться найти "наихудший случай" (для стека) - то есть такое сочетание вызовов и возможных прерываний, при котором стек будет использован максимально. Иногда это получается. Есть еще "экспериментальный" способ. Задаете стек с большим запасом. В начале работы программы заполняете всю область стека известными значениями (нулями, например). Даете поработать программе какое-то время на различных режимах, и затем смотрите - какая часть стека оказалась "затертой" (была использована). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
poq12 0 4 сентября, 2009 Опубликовано 4 сентября, 2009 · Жалоба Спасибо за ответы :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Как расположить стек по заданному адресу? Когда я задаю в свойствах проекта, что будет внешняя ОЗУ по адресам 0x64000000...0x40000, __initial_sp становится равным 0x64000400. Ну а дальше в определенный момент вываливается HardFault (это потом буду исследовать). Вручную в startup задать __initial_sp 0x20000400? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Когда я задаю в свойствах проекта... Давить все эти "свойства проекта" сразу нафиг и написать скрипт линкера самостоятельно, благо сие обычно документировано неплохо, да и сложности не представляет особой. Болванки образчики тоже есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Болванки образчики тоже есть. Так дайте мне какую-нибудь болванку :) Если не трудно. upd. В тех scatter-файлах, что я вижу в хэлпе, не нахожу упоминания стека. Что непонятно - в файле startup_stm32f10x_hd.s вижу стек по адресу 0x20000400. Как запускаю симулятор - загружается 0x64000400. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Так дайте мне какую-нибудь болванку :) Легко. У меня сейчас пока такая болванка IAR V5 для Сortex-M3, но Luminary, что совершенно не принципиально - только старшую часть таблицы векторов в соответствие с таблицей другого производителя подправить и все. Стек просто размещается в noinit секции, но естествено можно создать линкером и свою в желаемом месте. Что непонятно - в файле startup_stm32f10x_hd.s вижу стек по адресу 0x20000400. Как запускаю симулятор - загружается 0x64000400. А с чего Вы решили, что у Вас именно он используется? Его конкретно в проект запихнули? В том, что у Вас явно он уже в библиотеке скомпилированная и указатель на стек линкером из *.icf берется. Вообще, если в каком-то startup есть явное указателя на стек, то это явный дибилизм - ликер об этом не знает и спокойно когда-нибудь туда память распределит :(. Конечно,можно какую-то область памяти у линкера забрать, но тогда придется согласовывать числа в startup и линкере. Зачем? Startup_Link_Cortex_M3.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Я конкретно не указывал стек, иначе зачем бы я вопрос задавал. Как только указал в настройках, что есть внешняя память, и отметил птички default и noinit, так он сам туда переназначается. В симуляторе вижу R13(SP)=0x64000400. Убрал птичку default с адресов 0x64000000... - стек стал таким, как надо. Похоже, с этой бедой я "справился" :) За файлик - спасибо! А что ж тогда эта птичка default делает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба А что ж тогда эта птичка default делает? Верите, но отродясь во всякие визардики с галочками не заходил, посему не знаю и знать не хочу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Верите, но отродясь во всякие визардики с галочками не заходил, посему не знаю и знать не хочу. То - не визард, а опции для проекта, закладка Target. В другие закладки Вы же заходили, процессор выбирали, отладчик выбирали, оптимизацию...? А, Вы же в IAR работаете... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба В другие закладки Вы же заходили Зачем. если есть отработанный и отполированный и, что самое главное ДОКУМЕНТИРОВАННЫЙ интерфейс командной строки? В IDE захожу дабы собрать покрутить какие-либо образчики чужих проектов. И все. Но даже в IDE есть возможность подсовывать вой скрипт и работать не с мутными галочками а с параметрами командной строки. То - не визард Визард и есть - вместо нормального управления несколько готовых рецептов - пипл хавает :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2010 Опубликовано 13 мая, 2010 · Жалоба Зачем. если есть отработанный и отполированный и, что самое главное ДОКУМЕНТИРОВАННЫЙ интерфейс командной строки? В IDE захожу дабы собрать покрутить какие-либо образчики чужих проектов. И все. Но даже в IDE есть возможность подсовывать вой скрипт и работать не с мутными галочками а с параметрами командной строки. Это вопрос личных предпочтений. А на этапе освоения визард - самый легкий путь. Но не всегда кратчайший. Я вот связался с библиотекой от ST, теперь ноги разъезжаются, не знаю где глюки искать, или какую еще функцию не вызвал. Но "на переправе коней не меняют". Заработает - начну с нуля, все свое писать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба По поводу размера стека поделюсь информацией. Был у меня стек 0x0400, как, собственно, и стоял в startup. Думал я, зачем столько? Потом смотрю в симуляторе - осталось 0x040 примерно. Оказывается, когда инициализировал контроллер ЖКИ, висящий на внешней шине, процессор перенес массив констант для инициализации из флэш-памяти в стек, а уж потом оттуда по-быстрому забросил в контроллер ЖКИ. Кто бы мог подумать? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 15 мая, 2010 Опубликовано 15 мая, 2010 · Жалоба Кто бы мог подумать? :) Писатель должен был подумать, вообще-то. В стек компилятор просто так ничего не упихивает, если его не попросить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться