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

 
 
> C компилятор вообще и GCC в частности, вопросы начального уровня
Dopler
сообщение Feb 18 2010, 08:40
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Здравствуйте.
Изучаю GCC (на платформе AVR32). Раньше программировать на C для контроллеров не приходилось, поэтому возникает много общих вопросов о том, как это все устроено. Более-менее изучил документацию на make и ld. Малость
освоился в Eclipse. А вот с компилятором много не понятного. Документация читается тяжело. В "Using the GNU Compiler Collection" описаны по большей части ключи да разные режимы работы. "GNU Compiler Collection Internals"
для меня пока сложен, я почти не понимаю, о чем речь.
1. Как устроена C программа, т.е. какие минимальные действия нужно выполнить для инициализации окружения: инициализировать стек и кучу, обнулить глобальные переменные, что еще?
2. Если создать примитивный проект с пустой функцией main, то gcc подключает стандартный стартап, в итоге в выходном .elf файле появляется ряд секций.
Не понятно, какие из этих секций порождает компилятор, а какие описаны в стартовом коде. И вообще где почитать, какие секции для работы C программы обязательны (как они называются, что в них размещается).
В документации на GCC (gccint.pdf) про секции только упоминается, причем никакой конкретики. Может быть, плохо искал?
3. Во всех Atmelo'вских примерах и при компиляции и при компоновке вызывается avr32-gcc.exe, причем параметры конкретно линкеру передаются через Wl. Почему не принято вызывать, например, линкер на прямую, зачем в этом
случае прослойка в виде gcc.exe?
4. Используется ли динамическая память в контроллерах (malloc и free), и если используется, то как реализуется менеджер памяти?
5. Что такое отладочная информация (которая включается ключом -g)? Это просто ссылки на файлы с исходным кодом в итоговом elf, или какой-то код идет в прошивку? Почему эклипс периодически при отладке заявляет, что исходник не обнаружен, хотя если нужный файл открыть в ручную, то отладчик по нему отлично шагает?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 18 2010, 12:10
Сообщение #2


Гуру
******

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



Цитата(Dopler @ Feb 18 2010, 10:40) *
"GNU Compiler Collection Internals" для меня пока сложен, я почти не понимаю, о чем речь.
Он вам пока не нужен. Пока вы не захотите что-то подправить в самом компиляторе или портировать его для нового процессора.
Цитата(Dopler @ Feb 18 2010, 10:40) *
1. Как устроена C программа, т.е. какие минимальные действия нужно выполнить для инициализации окружения: инициализировать стек и кучу, обнулить глобальные переменные, что еще?
Скопировать начальные значения в инициализированные глобальные и статические переменные, вызвать конструкторы(для С++), вызвать собственно main(). После возврата из main() вызвать деструкторы(для С++), закрыть файлы(если они есть), освободить память кучи, отдать управление операционной системе(если она есть) или бесконечный цикл. Все это называется C-startup код. Не знаю, как для AVR32, для AVR он уже есть готовый библиотечный, для ARM без ОС он подключается к проекту отдельным ассемблерным файлом. Обычно носит название crt???.S или gcrt???.S
Цитата(Dopler @ Feb 18 2010, 10:40) *
2. Если создать примитивный проект с пустой функцией main, то gcc подключает стандартный стартап, в итоге в выходном .elf файле появляется ряд секций.
Не понятно, какие из этих секций порождает компилятор, а какие описаны в стартовом коде. И вообще где почитать, какие секции для работы C программы обязательны (как они называются, что в них размещается).
О! Значит библиотечный стартап есть и до возникновения острой необходимости можете о нем не думать. Можете смело рассчитывать, что на момент запуска main() все проинициализировано в соответствии со стандартом. Основных секций три: .text = это программный код, .bss - неинициализированные явно глобальные и статические переменые (те, которые обнуляются) и в последних версиях gcc сюда попадают явно проинициализированные нулем переменные. .data - это проинициализированные глобальные и статические переменные. В секции .rodata хранятся константы. .debug_*, .stabs.* - отладочная информация. Вроде ничего важного не забыл. Возможны еще какие-то секции специфичные для конкретной архитектуры.
Цитата(Dopler @ Feb 18 2010, 10:40) *
В документации на GCC (gccint.pdf) про секции только упоминается, причем никакой конкретики. Может быть, плохо искал?
Я тоже не нашел sad.gif
Цитата(Dopler @ Feb 18 2010, 10:40) *
3. Во всех Atmelo'вских примерах и при компиляции и при компоновке вызывается avr32-gcc.exe, причем параметры конкретно линкеру передаются через Wl. Почему не принято вызывать, например, линкер на прямую, зачем в этом случае прослойка в виде gcc.exe?
Она знает кучу параметров по умолчанию, которые в противном случае пришлось бы указывать вручную. Для AVR, например, в зависимости от выбранного типа процессора она компилятору определяет кучу служебных символов (__HAS_RAMPZ и подобные), а линкеру подставляет нужный скрипт, нужный файл стартапа. В общем - полезно. В makefile, опять же, вам надо указать путь только к этой программе а она уже сама найдет и нужный препроцессор и компилятор и ассемблер и линкер.
Цитата(Dopler @ Feb 18 2010, 10:40) *
4. Используется ли динамическая память в контроллерах (malloc и free), и если используется, то как реализуется менеджер памяти?
Если надо - используется. Конкретную реализацию надо смотреть в потрохах библиотеки (clib, newlib или какая там для AVR32), но с точки зрения программы они все работают так, как описано в стандарте С.
Цитата(Dopler @ Feb 18 2010, 10:40) *
5. Что такое отладочная информация (которая включается ключом -g)? Это просто ссылки на файлы с исходным кодом в итоговом elf, или какой-то код идет в прошивку? Почему эклипс периодически при отладке заявляет, что исходник не обнаружен, хотя если нужный файл открыть в ручную, то отладчик по нему отлично шагает?
Это информация и о строках исходного файла соответствующих конкретным ассемблерным командам, и об адресах и типах данных (в том числе и о структурах, классах, и т.д). Эклипс может не находить исходники если elf перемещался в другое место перед отладкой. Там, кажется, пишутся относительные пути.


--------------------
На любой вопрос даю любой ответ
"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



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

 


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


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