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

 
 
> GCC C++ для AVR, общие вопросы
spongebob
сообщение Apr 23 2012, 10:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 126
Регистрация: 14-11-10
Пользователь №: 60 879



Всем привет!

Подскажите, пожалуйста, каков механизм вызова функций в Си++?
Имеет ряд вложенных функций (работа с массивами), хочется посчитать какой максимальный объем памяти в стеке они потребуют (передача параметров + сами данные в функциях).
Можно как-нибудь "автоматизировать" процесс подсчета? Видимо, читать значение указателя стека в определенные моменты времени?
Все ли локальные переменные, объявляемые в функциях, создаются в стеке?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
spongebob
сообщение Apr 27 2012, 10:19
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 126
Регистрация: 14-11-10
Пользователь №: 60 879



Вопросы по секциям.
Читаю http://www.nongnu.org/avr-libc/user-manual, но там как-то очень скупо все описано... прошу помочь разобраться.

Записи -Wl,--section-start=.data=0x802000 и -Wl,--section-start,.data=0x802000 эквивалентны?
Т. е., синтаксис указания начала расположения секций имеет несколько вариантов?

Как на самом деле выглядят секции .data, .bss, .noinit?

Как я понимаю, данные из .data копируются в определенный момент времени в ОЗУ, инициализируя переменные. Когда копируются и кем? Нашел нечто в описании секции .init4, но там сказано про контроллеры с ОЗУ > 64 кБ ПЗУ (а это почему?).
Для секции .bss аналогичной операцией является заполнение нулями. Когда?
А для чего нужна секция .noinit? Ведь есть же .data и .bss.

Правильно ли я понимаю, что все глобальные или статические переменные, которые инициализированы программистом попадают в .data, а неинициализированные глобальные и статические переменные попадают в .bss и инициализируются нулями (по стандарту Си)?
А что происходит с локальными инициализированными переменными? Они же создаются на стеке, кто их и когда инициализирует?

Зачем нужны .finiN, если мы в main() обычно делаем while(1) {};?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 27 2012, 11:09
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (spongebob @ Apr 27 2012, 13:19) *
Записи -Wl,--section-start=.data=0x802000 и -Wl,--section-start,.data=0x802000 эквивалентны?
Т. е., синтаксис указания начала расположения секций имеет несколько вариантов?
Да, эквивалентны. Это синтаксис ключа -Wl передачи параметров программой-драйвером (avr-)gcc программе-линкеру (avr-)ld:
QUOTE
-Wl,option
Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. You can use this syntax to pass an argument to the option. For example, `-Wl,-Map,output.map' passes `-Map output.map' to the linker. When using the GNU linker, you can also get the same effect with `-Wl,-Map=output.map'.

QUOTE (spongebob @ Apr 27 2012, 13:19) *
Как на самом деле выглядят секции .data, .bss, .noinit?
Как области памяти.
QUOTE (spongebob @ Apr 27 2012, 13:19) *
Как я понимаю, данные из .data копируются в определенный момент времени в ОЗУ, инициализируя переменные. Когда копируются и кем?
Да, верно понимаете. Копируются библиотечным стартап-кодом, который вызывается по вектору сброса и выполняется перед запуском main(). Этот код является частью avr-libc. Аналогично там же обнуляется секция .bss
QUOTE (spongebob @ Apr 27 2012, 13:19) *
А для чего нужна секция .noinit? Ведь есть же .data и .bss.
Для переменных, которые не нужно обнулять или инициализировать. Например, чтобы восстановить по их содержимому состояние программы после аварийного сброса по собаке или это может быть внешняя ОЗУ с батарейкой.
QUOTE (spongebob @ Apr 27 2012, 13:19) *
Правильно ли я понимаю, что все глобальные или статические переменные, которые инициализированы программистом попадают в .data, а неинициализированные глобальные и статические переменные попадают в .bss и инициализируются нулями (по стандарту Си)?
Да, правильно. Современные компиляторы могут помещать явно инициализированные нулем глобальные переменные в .bss вместо .data, чтобы не хранить их начальные значения и сэкономить таким образом память кода.

QUOTE (spongebob @ Apr 27 2012, 13:19) *
А что происходит с локальными инициализированными переменными? Они же создаются на стеке, кто их и когда инициализирует?
Исполняемый код функции во время ее исполнения, как правило непосредственно перед использованием локальной переменной. А вот место в стеке резервируется сразу под все локальные переменные на входе в функцию, чтобы не дергать указатель стека на каждую переменную. Естественно, компилятор использует одно и то же место на стеке под разные локальные переменные у которых не пересекается время жизни.

QUOTE (spongebob @ Apr 27 2012, 13:19) *
Зачем нужны .finiN, если мы в main() обычно делаем while(1) {};?
На случай, если вы захотите выйти из main(). Если вы из main() не выходите - можете удалить их из линкерного скрипта и сэкономить пару байтов кода. А можете подменить библиотечный exit() выключая в нем питание и тогда сможете выключать прибор выходя из main(). Перед выключением будут штатно и в нужном порядке вызываться деструкторы глобальных объектов. Мало ли, может быть вам это нужно. Например, закрыть файлы и отмонтировать файловую систему, предварительно сделав запись об отключении в деструкторе объекта-системного журнала событий. Программы бывают разные.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
spongebob
сообщение Apr 27 2012, 14:59
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 126
Регистрация: 14-11-10
Пользователь №: 60 879



Цитата(Сергей Борщ @ Apr 27 2012, 15:09) *
Да, верно понимаете. Копируются библиотечным стартап-кодом, который вызывается по вектору сброса и выполняется перед запуском main(). Этот код является частью avr-libc. Аналогично там же обнуляется секция .bss


По поводу вызова библиотечного стартап-кода. Как я понимаю, все что содержится в секциях .initN до вызова main() - это и есть стартап? sm.gif
Т. е., он "размазывается" по секциям .init0 ... .init9 с дальнейшей возможностью коррекции каждой из секций программистом (часть секций менять нельзя, как я понял)?
Кстати, когда мы объявляем функцию способом типа void my_init_portb (void) __attribute__ ((naked)) __attribute__ ((section (".init3"))); то это замещает все что было помещено стартапом в эти секции? А если несколько аналогичных выше указанным объявлениям, то все что объявлено разместится в секции .init3?

Цитата
На случай, если вы захотите выйти из main(). Если вы из main() не выходите - можете удалить их из линкерного скрипта и сэкономить пару байтов кода. А можете подменить библиотечный exit() выключая в нем питание и тогда сможете выключать прибор выходя из main(). Перед выключением будут штатно и в нужном порядке вызываться деструкторы глобальных объектов. Мало ли, может быть вам это нужно. Например, закрыть файлы и отмонтировать файловую систему, предварительно сделав запись об отключении в деструкторе объекта-системного журнала событий. Программы бывают разные.


Понятно, достаточно удобная вещь получается, если писать на Си++ sm.gif
Кстати, можете сказать что-нибудь по поводу избыточности/неизбыточности Си++ по отношению к Си и насколько оптимальным получается код для AVR, ARM?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- spongebob   GCC C++ для AVR, общие вопросы   Apr 23 2012, 10:21
- - MrYuran   http://stackoverflow.com/questions/6387614...syste...   Apr 23 2012, 10:35
|- - spongebob   Цитатаhttp://gcc.gnu.org/onlinedocs/gnat_ugn_unw.....   Apr 23 2012, 11:35
|- - MrYuran   Цитата(spongebob @ Apr 23 2012, 15:35) Во...   Apr 23 2012, 11:59
- - spongebob   Цитатаavr-g++.exe -mmcu=atmega1280 -Wall -ffunctio...   Apr 23 2012, 17:02
|- - MrYuran   Цитата(spongebob @ Apr 23 2012, 21:02) Не...   Apr 24 2012, 09:20
- - spongebob   Вот еще интересная ссылочка: http://www.avrfreaks....   Apr 24 2012, 09:11
- - spongebob   Касательно вот этого еще вопросы есть: http://www....   Apr 24 2012, 10:32
- - ReAl   Даже если указывать __heap_start и __heap_end, но ...   Apr 24 2012, 12:33
- - spongebob   Фигня какая-то... поставил 2010 WinAVR, он тоже оп...   Apr 24 2012, 17:22
- - spongebob   Стартап является универсальным для всех контроллер...   Apr 27 2012, 18:22
- - Сергей Борщ   QUOTE (spongebob @ Apr 27 2012, 17:59) По...   Apr 27 2012, 20:34


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:40
Рейтинг@Mail.ru


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