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

 
 
> Yagarto Eclipse+GCC4.2.1/4.2.2 - в хидерах компилятся все функции!, Это такая "особенность" или я ... ?
injen-d
сообщение Jan 11 2008, 19:40
Сообщение #1


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

Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250



Всем доброго времени суток.
Помогите пожалуйста, может кто сталкивался с подобными непонятками, буду очень признателен.
Не так давно AVRа стало маловато, решил переходить на ARM7, причем софт решил использовать свободный, чтоб так сказать все по честному. Выбор пал на YAGARTO Eclipse + GCC. До этого писал преимущественно на ассемблере, поэтому столкнулся с массой трудностей. Но постепенно все прояснялось, вот только со следующей проблемой борюсь уже 2 дня и ни сколько не продвинулся в ее решении. wacko.gif
Даже появились грешные мысли воспользоваться ломаным иаром или кейлом 05.gif
Проблема в следующем:
решил я воспользоваться файлом "libAT91SAM7S256.h" (взял его где-то из примеров) и сразу после его подключения и последующей компиляции (ни одну из его функций я еще не использовал) размер генерируемого кода увеличился с 1К до 17К. Как выяснилось компилятся все функции независимо от того, вызывались они или нет. После "танцев с бубном, протирки монитора и постукивания по системнику" совершенно чудесным образом хидер начал компилиться как надо: только те функции которые были вызваны из main (или другой функции). 08.gif
На радостях я решил сделать еще один хидер назвал его "icpsr.h" и вставил содержимое из файла "isrsupport.c" из примера demo_at91sam7_blink_flash. И тут опять старая проблема! Причем "libAT91SAM7S256.h" работает правильно, а "icpsr.h" компилится весь. Приведенные выше маневры не помогли. Подскажите, плиз проблема в компиляторе или в моей голове?
Проэкт прилагается.
Прикрепленный файл  NEW_workspace.rar ( 802.72 килобайт ) Кол-во скачиваний: 154


ЗЫ: при установке компилятору уровня оптимизации отличного от -О0 размер кода заметно сокращается, но компилятор начинает полностью игнорировать конструкции типа:
for (k = 600000; k != 0; k-- ); как будто их не существует!


--------------------
- Бендер, ты же робот, зачем тебе пить пиво?
- Незачем! Я могу бросить в любой момент!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
injen-d
сообщение Jan 12 2008, 19:01
Сообщение #2


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

Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250



Спасибо за разъяснение, но это проблему не решило.
Я поправил Makefile, правда не совсем так, как вы указали:
Код
CFLAGS += -ffunction-sections -fdata-sections    # to remove dead code, if any, at link time  
LDFLAGS += -Wl,--gc-sections    #remove dead code ("garbage collection")

я исправил на:
Код
CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections

в соответствии с "GNAT User’s Guide For gcc version 4.2.2"
Цитата
7.3.2 Compilation options
The operation of eliminating the unused code and data from the final executable is directly
performed by the linker.
In order to do this, it has to work with objects compiled with the following options:
‘-ffunction-sections’ ‘-fdata-sections’. These options are usable with C and Ada
files. They will place respectively each function or data in a separate section in the resulting
object file.
Once the objects and static libraries are created with these options, the linker can perform
the dead code elimination. You can do this by setting the ‘-Wl,--gc-sections’
option to gcc command or in the ‘-largs’ section of gnatmake. This will create the final
executable, without including the code and data determined as never accessed.
Note that objects compiled without the ‘-ffunction-sections’ and ‘-fdata-sections’
options can still be linked with the executable. However, no dead code elimination will be
performed on those objects (they will be linked as is).
The GNAT static library is now compiled with -ffunction-sections and -fdata-sections.
This allows you to eliminate the unused code of the GNAT library from your executable.

После этого линкер начал требовать прописывания секции для каждой функции и глобальной переменной. После срочного изучения основ написания скриптов для линкера родились следующие строки:
Код
.text :        /* collect all sections that should go into FLASH after startup  */
    {
/*        *(.text)                    /* all .text sections (code)  */
        *(.text.main)
        *(.text.USART0_setup)
        *(.text.uart0_putc)
        *(.text.Usart_c_irq_handler)
        *(.text.LowLevelInit)
        *(.text.blinker)
                         ...

Проэкт начал компилиться без ошибок. biggrin.gif
Но не все так хорошо:
1) "правильно" компилятся только __inline функции, остальные же по-прежнему компилятся всегда и при удалении их вызова сами они никуда из итогового кода не исчезают.
2) линкер требует прописывания секций так же для функций находящихся в хидере icpsr.h (кроме __inline функций), даже если они не вызывались.
3) а если у меня в проэкте около сотни различных функций наберется? Это ж сколько писанины в разных файлах. wacko.gif А еще глобальные переменные...
Все вышеизложенное наталкивает на мысль, что решение должно быть гораздо проще.
К тому же, в первоначальном варианте, до вышеописанной правки, для эксперемента я сделал __inline все функции в файле icpsr.h, таким образом получилось два почти одинаковых файла icpsr.h и libAT91SAM7S256.h. Различие было лишь в количестве содержащихся функций. Затем я подключал эти хидеры в соседних строках одного си-файла и вызывал по одной функции из каждого файла тоже в соседних строках, при этом из файла libAT91SAM7S256.h компилировалась только вызываемая функция, а из icpsr.h все по отдельности + еще раз вызываемая на этот раз в нужном месте. Глаза поломал, но разницу между файлами (кроме количества содержащихся функций) не увидел. unsure.gif
В чем может быть причина?
Да и файл libAT91SAM7S256.h поначалу тоже компилился весь, но в какой-то момент во время танцев с бубном заработал как надо, и при последующей правке всяких мелочей содержимого и проб вариантов для поиска причины, работать не перестал.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 12 2008, 19:35
Сообщение #3


Гуру
******

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



Цитата(injen-d @ Jan 12 2008, 21:01) *
Я поправил Makefile, правда не совсем так, как вы указали:
Это не принципиально.
Цитата(injen-d @ Jan 12 2008, 21:01) *
После этого линкер начал требовать прописывания секции для каждой функции и глобальной переменной.
Я тоже не большой специалист, но у меня получилось так:
Код
  .text :
  {
    .......
    *(.text)            /* code */
    *(.text.*)          /* code */

    .............
  } > ROM
Аналогично и для данных. Приведенные выше ключи компилятора заставляют выделять отдельную секцию для каждой функции и для каждой переменной (ибо линкер по --gc-sections умеет выкидывать только секции целиком).
Цитата(injen-d @ Jan 12 2008, 21:01) *
Все вышеизложенное наталкивает на мысль, что решение должно быть гораздо проще.
Использование шаблонного символа '*' в скрипте.
Цитата(injen-d @ Jan 12 2008, 21:01) *
Затем я подключал эти хидеры в соседних строках одного си-файла и вызывал по одной функции из каждого файла тоже в соседних строках, при этом из файла libAT91SAM7S256.h компилировалась только вызываемая функция, а из icpsr.h все по отдельности + еще раз вызываемая на этот раз в нужном месте.
Если до понедельника никто не ответит - покомпилирую приложенный вами выше проект, помедитирую. Пока не готов дать ответ.


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

Сообщений в этой теме
- injen-d   Yagarto Eclipse+GCC4.2.1/4.2.2 - в хидерах компилятся все функции!   Jan 11 2008, 19:40
- - Сергей Борщ   Цитата(injen-d @ Jan 11 2008, 21:40)...   Jan 11 2008, 21:17
|- - zltigo   Цитата(injen-d @ Jan 12 2008, 21:01)...   Jan 12 2008, 19:44
|- - injen-d   Цитата(zltigo @ Jan 12 2008, 22:44) А с к...   Jan 12 2008, 19:56
|- - zltigo   Цитата(injen-d @ Jan 12 2008, 21:56)...   Jan 12 2008, 20:46
|- - injen-d   Цитата(zltigo @ Jan 12 2008, 23:46) Дык, ...   Jan 12 2008, 20:50
|- - Сергей Борщ   Цитата(injen-d @ Jan 12 2008, 22:50)...   Jan 12 2008, 22:39
- - injen-d   ЦитатаУказание в скрипте линкера входных секций ка...   Jan 13 2008, 10:33
|- - zltigo   Цитата(injen-d @ Jan 13 2008, 12:33)...   Jan 13 2008, 10:41
|- - Сергей Борщ   Цитата(injen-d @ Jan 13 2008, 12:33)...   Jan 13 2008, 11:25
- - injen-d   Цитатагруппы функций разбить по файлам Значит вс...   Jan 13 2008, 11:02
|- - zltigo   Цитата(injen-d @ Jan 13 2008, 13:02)...   Jan 13 2008, 11:28
- - injen-d   ЦитатаДо меня только сегодня дошло - вы опцию, кот...   Jan 13 2008, 11:47
|- - Сергей Борщ   Цитата(injen-d @ Jan 13 2008, 13:47)...   Jan 13 2008, 12:12
- - injen-d   Добавил: Код. = 0x0000000; .text : { KEEP...   Jan 13 2008, 12:44
- - Сергей Борщ   Цитата(injen-d @ Jan 13 2008, 14:44)...   Jan 13 2008, 19:03


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 13:57
Рейтинг@Mail.ru


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