Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Пн дек 07, 2015 06:56:01
Сверлит текстолит когтями
Карма: 5
Рейтинг сообщений: 19
Зарегистрирован: Вт фев 01, 2011 17:56:40 Сообщений: 1273 Откуда: г. Жуковка, Брянская обл.
Рейтинг сообщения:0
Задал для кода - 2, фасм делает 21 проход , когда 4 - 6 проходов. objdump нормально распознает все функции, правда их тело не всегда дизассемблирует, представляя его в виде набора байт, а не инструкций.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Пн дек 07, 2015 22:09:33
Сверлит текстолит когтями
Карма: 5
Рейтинг сообщений: 19
Зарегистрирован: Вт фев 01, 2011 17:56:40 Сообщений: 1273 Откуда: г. Жуковка, Брянская обл.
Рейтинг сообщения:0
А что надо указывать? cortex-m3 вроде как не arm в прямом смысле, у него же только thumb-2 набор инструкций как я понял ... Указал -m arm, листинг дизассемблера практически не изменился (или я не заметил).
Добрый день, возник такой вопрос если в main объявляю порядка 15 локальных переменных и запускаю программу, данные, хранящиеся в переменных портятся(что-то их перезаписывает). Думал стек разросся, понаблюдал за ним до переполнения стека еще далеко, если правильно понимаю то в map файле стек ограничен двумя адресами
Код:
STACK 0x20000480 Section 1024 startup_stm32f10x_hd.o(STACK) Stack_Mem 0x20000480 Data 1024 startup_stm32f10x_hd.o(STACK) __initial_sp 0x20000880 Data 0 startup_stm32f10x_hd.o(STACK)
Может где-то рассуждения ошибочны? Почему такое может происходить? Если переменные объявить как static, или глобально то программа начинает нормально работать и данные не портятся.
А оно нужно? Сомневаетесь в стеке просто увеличьте его. Если пользуетесь кучей то и кучу заодно. Судя по вашему предыдущему сообщению дело не в стеке. Почитайте про квалификаторы область видимости и время жизни переменных. В вашем случае перестарался оптимизатор. Какую-то переменную (переменные) понадобится объявить как volatile чтобы оптимизатор не сильно своевольничал.
Зависит от политики оптимизатора. Прочитайте внимательно сам вопрос.
Цитата:
если в main объявляю порядка 15 локальных переменных и запускаю программу, данные, хранящиеся в переменных портятся(что-то их перезаписывает).
И как бы само решение.
Цитата:
Если переменные объявить как static, или глобально то программа начинает нормально работать и данные не портятся.
Глобальные вроде тоже живут от включения и до выключения. Но оптимизатор почему-то решил что в одном случае можно напортачить а в другом нет. Возможно потому что main типа тоже функция.
Глобальные вроде тоже живут от включения и до выключения.
Да, это так, но они живут не на стеке.
scorpi_0n писал(а):
Но оптимизатор почему-то решил что в одном случае можно напортачить а в другом нет.
Это не оптимизатор решил, а стек и куча наложились друг на друга. А как только эти переменные объявляются статическими, им эта чехарда уже не грозит. Я бы попробовал сначала самое простое решение - увеличение стека(*). И это выше уже советовали. Если чехарда прекратится при достаточном стеке, то уже дальше можно выяснять, когда, где и как это происходит. Или не выяснять, просто оставив найденный безопасный размер стека. У IAR'а был хороший документ на эту тему, но это не самый простой труд, отслеживание таких проблем. Проще иметь запас.
(*) Если конечно в программе нет ошибок типа рекурсии с неверным условием выхода.
То что стек не разросся установленно было так, перед выполнением программы он заполнялся шаблоном СССССС и потом мониторился во вкладке memory, по адресу указанному в map файле.
Размер стека увеличивал не помогло.
То же думаю что локальные переменные хранятся в стеке, от и до жизни программы, но дело в том что стека то, два, может один налазит на другой?
Значит быстрее всего дело не в стеке или мало увеличили.
Цитата:
То же думаю что локальные переменные хранятся в стеке, от и до жизни программы
Да не факт. Если компилятор посчитает какой-то кусок ненужным он его запросто выбросит вместе с переменной. Прерывания есть? Есть переменные которые изменяются в майне и в прерывании?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения