Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 22:39

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 10:55 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Пишу проект под stm32F103VE. IDE Coocox. комплятор gcc arm.
Результат компиляции:
Код:
Program Size:
      text      data       bss       dec       hex   filename
     12640     43472      1328     57440      e060   guiProg_VE.elf

Гугление мне ответило, что text это собственно сам код. data это константные переменные, значение которых задано при компиляции. bss это остальные переменные. по поводу dec гугл сказал что
Цитата:
"dec" is short for decimal and shows the size in decimal and is not placed anywher

Теперь я попробую сказать как я понял вышенаписанное, а вы, пожалуйста меня поправьте, если что-то не так.
text это инструкции, они распологаются во Flash. data так же располагаются во флеш, ибо они константы и не изменяются. Это сделано для того, чтобы экономить оперативку, хотя в интернетах написано, что они могут распологаться и в RAM также. Отсюда вопрос: как компилятор решает где их расположить? bss полностью кладутся в RAM (оперативку), ибо они переменные и постоянно изменяются.
И еще вопрос, как точно узнать, войдет ли данный код в контроллер, и насколько я приближаюсь к максимуму?
Чтобы экономить оперативку, всякие строки объвляю как const char[] = "Hello"; ? (недавно перелез с АВР, там жестко диррективами задавал куда класть переменные).
И еще, есть функция LCD_Text(char *str); , которая выводит нуль-терминированную строку на дисплей. Допустим я ее вызываю так:
Код:
LCD_Text((const char*)"Привет");
Тоесть я привожу строку, объявленную тут же к константному типу. Она будет расположена во флеше?

Заранее спасибо за ответы.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 13:19 
Заглядывает иногда

Зарегистрирован: 19 июл 2012, 10:52
Сообщения: 39
полезно Вам почитать вот это будет:
http://avr-libc.narod.ru/mem_sections.html
размер выдает утилита size.exe.
также почитать вот это
http://we.easyelectronics.ru/CADSoft/ob ... ast-2.html

и вот это

http://we.easyelectronics.ru/CADSoft/ob ... ast-1.html

А еще есть нихуевая книжка GCC - Полное руководство, 2004 года выпуска, но советую использовать как справочник, она на русском

в авр гцц строки во флеш задавались директивой PROGMEM
а const переменная размещалась во флеше и копировалась в оперативу до входа в main() (если я сам конечно правильно понял)) )

ЗЫ. компилятор ничего не размещает,
размещает линкер.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 13:51 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Martovskij писал(а):
полезно Вам почитать вот это будет:
http://avr-libc.narod.ru/mem_sections.html
размер выдает утилита size.exe.
также почитать вот это
http://we.easyelectronics.ru/CADSoft/ob ... ast-2.html

и вот это

http://we.easyelectronics.ru/CADSoft/ob ... ast-1.html

А еще есть нихуевая книжка GCC - Полное руководство, 2004 года выпуска, но советую использовать как справочник, она на русском

Спасибо за ссылки и книжки, сейчас прочитаю.
Цитата:
в авр гцц строки во флеш задавались директивой PROGMEM
а const переменная размещалась во флеше и копировалась в оперативу до входа в main() (если я сам конечно правильно понял)) )

Так эта директива же для winavr gcc с ее гарвардской архитектурой.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 15:12 
Заглядывает иногда

Зарегистрирован: 19 июл 2012, 10:52
Сообщения: 39
[/quote]
Так эта директива же для winavr gcc с ее гарвардской архитектурой.[/quote]

Дык а у STM32 какая архитектура?......
Просто, решил Вам напомнить, как это делалось в авр.
Вообще, GCC - великий компилятор, и надо читать документацию на ИСПОЛЬЗУЕМЫЙ ВАМИ компилятор, чтобы определить наверняка какие ключевые слова определяют секции.
Сам юзаю Сщгксукн П++ ДШУТ.:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 15:27 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Martovskij писал(а):
Дык а у STM32 какая архитектура?......

фон неймана как таковая

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 15:36 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Цитата:
Сам юзаю Сщгксукн П++

о_О
П++ русская версия что-ли? :)))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 15:44 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
text - код в ПЗУ, data - переменные в ОЗУ (а начальные данные в ПЗУ), bss - переменные с 0-ым начальным значением, dec - всё вместе (можете пересчитать :). dec для МК смысла не имеет, так как text + data идут в ПЗУ, а data + bss в ОЗУ, и ни один, из этих конечных показателей использования ресурсов МК, явно не выведен.

Всё что объявлено const ложится в секцию rodata в ПЗУ (касается stm32).

Последний вопрос ТС:
всё верно, даже можно обойтись без приведения типа, так как строковые литерали итак имеют тип const char*

Cortex-M3 - это мк с ГАРВАРДСКОЙ архитектурой (пруф). То что у мк можно выполнять код из ОЗУ, или единое адресное пространство - не делает архитектуру мк фон Неймана.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 19:35 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
amx писал(а):
text - код в ПЗУ, data - переменные в ОЗУ (а начальные данные в ПЗУ), bss - переменные с 0-ым начальным значением, dec - всё вместе (можете пересчитать :). dec для МК смысла не имеет, так как text + data идут в ПЗУ, а data + bss в ОЗУ, и ни один, из этих конечных показателей использования ресурсов МК, явно не выведен.

Всё что объявлено const ложится в секцию rodata в ПЗУ (касается stm32).

Последний вопрос ТС:
всё верно, даже можно обойтись без приведения типа, так как строковые литерали итак имеют тип const char*

Cortex-M3 - это мк с ГАРВАРДСКОЙ архитектурой (пруф). То что у мк можно выполнять код из ОЗУ, или единое адресное пространство - не делает архитектуру мк фон Неймана.


спасибо за ответы. теперь практически все уложилось. И тут еще один вопрос назрел. Есть структура данных, заполняется при старте из внешней энергонезависимой памяти. Если не инициализировать ее начальными значениями, то эти переменные расположатся в bss, а их начальные значения (ибо их нет) не будут расположены в ПЗУ? (то есть получится сэкономить немного ПЗУ)

upd, и теперь нашел свою оплошность. 40 килобайт data это были шрифты для лсд дисплея. Массивы не были объявлены как const, и отсюда такой перерасход памяти.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 10 авг 2012, 20:12 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
elisey писал(а):
Есть структура данных, заполняется при старте из внешней энергонезависимой памяти. Если не инициализировать ее начальными значениями, то эти переменные расположатся в bss, а их начальные значения (ибо их нет) не будут расположены в ПЗУ? (то есть получится сэкономить немного ПЗУ)
Да. Все статические и глобальные переменные, начальные значения которых не заданы, забиваются нулями и "места в ПЗУ" не занимают.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 12 авг 2012, 19:50 
Старожил

Зарегистрирован: 29 окт 2010, 23:55
Сообщения: 327
elisey писал(а):
И еще, есть функция LCD_Text(char *str); , которая выводит нуль-терминированную строку на дисплей.

Не делайте так в стм32. Если функция не изменяет параметр переданныый ей по указателю/ссылке, возьмите за правило ставить модификатор const у аргумента:
Код:
void LCD_Text(const char *str) { ... }

Тогда вам будет всё равно находится строка во флеш или в рам. И избежите предупреждений и ошибок при компиляции.
Остальное вроде уже прояснили.

_________________
http://angel5a.narod.ru - LPC/STM8/anything yet?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размещение переменных в прошивке
СообщениеДобавлено: 12 авг 2012, 20:25 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1799
Откуда: Новокузнецк
Angel5a писал(а):
elisey писал(а):
И еще, есть функция LCD_Text(char *str); , которая выводит нуль-терминированную строку на дисплей.

Не делайте так в стм32. Если функция не изменяет параметр переданныый ей по указателю/ссылке, возьмите за правило ставить модификатор const у аргумента:
Код:
void LCD_Text(const char *str) { ... }

Тогда вам будет всё равно находится строка во флеш или в рам. И избежите предупреждений и ошибок при компиляции.
Остальное вроде уже прояснили.

хорошо, спасибо. поменяю тип входного параметра у функции)

_________________
elisey.su


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB