|
Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы... |
|
|
|
 |
Ответов
(30 - 44)
|
Nov 24 2008, 20:23
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(ARV @ Nov 25 2008, 00:00)  Код avr-g++ -ffunction-sections -Wl,-gc-sections,-Map,FanController.map,--cref --relax -mmcu=atmega88 Дело в том, что я компилирую через Эклипс Ганимед. И там доп. опции куда хочешь не добавить - только в специально отведённую для этого строку. Есть там вот что: Код Expert settings. Command line pattern: ${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} Может, это и есть очерёдность ввода параметров? Вот что у меня теперь: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections -gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o Finished building target: FanController.elf
|
|
|
|
|
Nov 24 2008, 21:14
|

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

|
Цитата(sonycman @ Nov 24 2008, 22:23)  Вот что у меня теперь: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections -gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o Finished building target: FanController.elf Добавьте -Wl, перед -gc-sections. Странно, что для линковки вызывается avr-g++ а не avr-gcc или avr-ld
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 24 2008, 23:36
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Сергей Борщ @ Nov 25 2008, 01:14)  Добавьте -Wl, перед -gc-sections. Странно, что для линковки вызывается avr-g++ а не avr-gcc или avr-ld Так выдаёт ошибку: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o avr-g++.exe: Wl,-gc-sections: No such file or directory make: *** [FanController.elf] Error 1 А что вообще означают опции Wl и -gc-sections?
|
|
|
|
|
Nov 25 2008, 05:56
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
-ff-sections заставляет компилятор размещать код каждой функции в отдельной секции памяти. -gc-sections заставляет компоновщик удалять все секции кода, на которые нет ссылок из других секций. в итоге все функции, которые в тексте определены, но ни разу не вызваны, удаляются из результирующего кода, чем уменьшается его размер. -Wl, - это опция, которая указывает, что компоновщику надо передать список следующих опций (список разделяется запятыми). При этом в списке недопустимы пробелы, которые обозначают конец списка. Именно по этому лучше тупо писать -Wl,-gc-sections , чем добавлять опции к командной строке иными способами. для Eclipse Ganimed (которым я и сам пользуюсь) имеется плагин, специально предназначенный для работы с AVR, по-моему, он называется avreclipse. Этот плагин имеет "очеловеченный" интерфейс к avr-gcc, который позволяет большинство опций задавать "галочками", а для остальных есть поля ручного ввода. При ручном вводе опции просто добавляются, проблем не возникает. И никаких заморочек с make-файлами, все автоматически делается. Рекомендую. P.S. по непонятным причинам, результат компиляции одного и того же проекта с одинаковыми (во всяком случае, с моей точки зрения) опциями в AVR Studio и Eclipse получается (у меня) разным! Второй - меньшего размера  подозреваю, что дело в том, в каком порядке компилируются файлы проекта (порядок реально разный получается)...
Сообщение отредактировал ARV - Nov 25 2008, 06:02
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Nov 25 2008, 07:39
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(sonycman @ Nov 25 2008, 01:36)  Так выдаёт ошибку: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -ffunction-sections Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o avr-g++.exe: Wl,-gc-sections: No such file or directory make: *** [FanController.elf] Error 1 А что вообще означают опции Wl и -gc-sections?  Для того, что бы удалялись неиспользуемые функции -ffunction-sections надо передавать компилятору, а --gc-sections -- линкеру/компоновщику. А ошибка в том, что вы забыли "-" перед Wl,-gc-sections
|
|
|
|
|
Nov 25 2008, 09:41
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(gotty @ Nov 25 2008, 11:39)  Для того, что бы удалялись неиспользуемые функции -ffunction-sections надо передавать компилятору, а --gc-sections -- линкеру/компоновщику. А ошибка в том, что вы забыли "-" перед Wl,-gc-sections Спасибо. Просто мне посоветовали -ffunction-sections тоже передать линкеру В общем - сделал вот так: Компилятор: Код Invoking: AVR C++ Compiler avr-g++ -I"F:\Electronics\Projects\GNU\FanController\Headers" -Wall -g2 -gdwarf-2 -Os -fpack-struct -fshort-enums -mcall-prologues -std=gnu++98 -funsigned-char -funsigned-bitfields -fno-exceptions -fno-threadsafe-statics -fno-inline-small-functions -ffunction-sections -mmcu=atmega88 -DF_CPU=10000000UL -MMD -MP -MF"Sources/pwm.d" -MT"Sources/pwm.d" -c -o"Sources/pwm.o" "../Sources/pwm.cpp" Finished building: ../Sources/pwm.cpp Линкер: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o Finished building target: FanController.elf Код проекта сразу уменьшился на 600 байт! Надо проверить, что он там повыкидывал... ЗЫ: а ничего, что --relax передаётся без запятой? Цитата(ARV @ Nov 25 2008, 09:56)  -ff-sections заставляет компилятор размещать код каждой функции в отдельной секции памяти. -gc-sections заставляет компоновщик удалять все секции кода, на которые нет ссылок из других секций. в итоге все функции, которые в тексте определены, но ни разу не вызваны, удаляются из результирующего кода, чем уменьшается его размер. -Wl, - это опция, которая указывает, что компоновщику надо передать список следующих опций (список разделяется запятыми). При этом в списке недопустимы пробелы, которые обозначают конец списка. Именно по этому лучше тупо писать -Wl,-gc-sections , чем добавлять опции к командной строке иными способами.
для Eclipse Ganimed (которым я и сам пользуюсь) имеется плагин, специально предназначенный для работы с AVR, по-моему, он называется avreclipse. Этот плагин имеет "очеловеченный" интерфейс к avr-gcc, который позволяет большинство опций задавать "галочками", а для остальных есть поля ручного ввода. При ручном вводе опции просто добавляются, проблем не возникает. И никаких заморочек с make-файлами, все автоматически делается. Рекомендую. Спасибо за разъяснение. У меня установлен именно avreclipse плагин, версии 2.3.0.
|
|
|
|
|
Nov 25 2008, 10:01
|
Знающий
   
Группа: Свой
Сообщений: 526
Регистрация: 24-08-07
Из: Беларусь, Минск
Пользователь №: 30 045

|
Цитата(sonycman @ Nov 25 2008, 11:41)  Линкер: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o Finished building target: FanController.elf Код проекта сразу уменьшился на 600 байт! Надо проверить, что он там повыкидывал... ЗЫ: а ничего, что --relax передаётся без запятой? Ничего страшного, по моим представлениям запись вида -Wl,--gc-sections вместо --gc-sections используется лиш в случае совмещения компиляции и скомпоновки, аналогично и --relax, и -Map и все остальные параметры компоновщика. Что бы проверить, какие секции были выкинуты сборщиком мусора, можно добавить параметр --print-gc-sections
|
|
|
|
|
Nov 25 2008, 10:42
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(ARV @ Nov 25 2008, 13:52)  практика показывает, что ничего полезного не выкидывает  Проверил - всё в порядке, выкинул только не используемые функции Прекрасно! Цитата(gotty @ Nov 25 2008, 14:01)  Ничего страшного, по моим представлениям запись вида -Wl,--gc-sections вместо --gc-sections используется лиш в случае совмещения компиляции и скомпоновки, аналогично и --relax, и -Map и все остальные параметры компоновщика. Что бы проверить, какие секции были выкинуты сборщиком мусора, можно добавить параметр --print-gc-sections А я уже листинги сравнил тотал коммандером Понятно, значит, --relax оставляю как есть.
|
|
|
|
|
Nov 25 2008, 21:58
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Привет, sonycman! Цитата(sonycman @ Nov 24 2008, 16:05)  Также в коде есть одна немаленькая inline функция, которая используется всего один раз (и то, понятно, инлайнится в тело вызывающей функции), но непонятно, почему остаётся её вторая копия? Можно тестовый пример с версией и опциями компилятора? Цитата(sonycman @ Nov 24 2008, 16:05)  За короткое время знакомства с GCC понравилось: удобная реализация атомарности через макросы ATOMIC_BLOCK(), удобная обёртка для обработчиков прерываний вида ISR(vector_name){}. Так это как раз не компилятор, это просто библиотечные макросы. Аналогичные макросы можно сделать для любого минимально вменяемого компилятора. Цитата(sonycman @ Nov 24 2008, 16:05)  Видно, что для деления вызывается подпрограмма библиотеки. Почему не используется простой сдвиг? Видимо, потому что простой сдвиг не умещается в три процессорные инструкции. При отличной от -Os оптимизации генерится именно сдвиг. Цитата(sonycman @ Nov 24 2008, 16:05)  А где можно почитать про флаги для оптимизации? В документации, естественно: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gc...ptimize-OptionsЦитата(sonycman @ Nov 24 2008, 16:05)  А что вообще означают опции Wl и -gc-sections? Все описано в мануалах. Про эти две тебе уже ответили, но в мануалах есть еще не один десяток опций, о которых полезно знать... Цитата(MrYuran @ Nov 24 2008, 19:22)  Я обычно ручками пишу <<1 (2,3,etc) или >>1, не надеясь на компилятор. И зря. "x / 2" и "x >> 1" - не эквивалентные операции. Они дают гарантированно одинаковый результат только для положительного x. Но в этом случае (если x имеет тип unsigned) gcc и код генерит одинаковый (со сдвигом), и нет никакого смысла писать одно вместо другого. У sonycman же, судя по приведенному им примеру, левый операнд имеет знаковый тип.
Сообщение отредактировал alx2 - Nov 25 2008, 21:47
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Nov 26 2008, 09:39
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(ARV @ Nov 26 2008, 10:22)  на сколько я смог понять их документации, --relax для платформы AVR смысла не имеет. экспериментальная проверка на своем проекте подтвердила - 0 байт изменений с и без --relax На каком контроллере Вы проверяли, размер программы? Анатолий.
|
|
|
|
|
Nov 26 2008, 09:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(aesok @ Nov 26 2008, 12:39)  На каком контроллере Вы проверяли, размер программы?
Анатолий. проверял на контроллере AT90CAN128, программа в итоге получается 14606 байт. всего линкуется почти десяток объектников.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Nov 26 2008, 10:17
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(alx2 @ Nov 26 2008, 01:58)  Привет, sonycman! Можно тестовый пример с версией и опциями компилятора? Привет Сейчас у меня вот такие опции: Компилятор: Код Building file: ../Sources/main.cpp Invoking: AVR C++ Compiler avr-g++ -I"F:\Electronics\Projects\GNU\FanController\Headers" -Wall -g2 -gdwarf-2 -Os -fpack-struct -fshort-enums -mcall-prologues -std=gnu++98 -funsigned-char -funsigned-bitfields -fno-exceptions -fno-threadsafe-statics -fno-inline-small-functions -ffunction-sections -mmcu=atmega88 -DF_CPU=10000000UL -MMD -MP -MF"Sources/main.d" -MT"Sources/main.d" -c -o"Sources/main.o" "../Sources/main.cpp" и линкер: Код Building target: FanController.elf Invoking: AVR C++ Linker avr-g++ -Wl,-Map,FanController.map,--cref -Wl,-gc-sections --relax -mmcu=atmega88 -o"FanController.elf" ./Sources/CFanRegulator.o ./Sources/CTimer.o ./Sources/DS18S20.o ./Sources/Interrupts.o ./Sources/LCD.o ./Sources/USART.o ./Sources/debug.o ./Sources/generic.o ./Sources/main.o ./Sources/pwm.o Finished building target: FanController.elf С включением опции -Wl,-gc-sections неиспользуемая копия встраиваемой функции исчезла. Всё заработало правильно! Цитата Видимо, потому что простой сдвиг не умещается в три процессорные инструкции. При отличной от -Os оптимизации генерится именно сдвиг.
И зря. "x / 2" и "x >> 1" - не эквивалентные операции. Они дают гарантированно одинаковый результат только для положительного x. Но в этом случае (если x имеет тип unsigned) gcc и код генерит одинаковый (со сдвигом), и нет никакого смысла писать одно вместо другого. У sonycman же, судя по приведенному им примеру, левый операнд имеет знаковый тип. Да. Операнд имеет тип signed char. Именно в этом, видимо, и вся проблема. Спасибо, теперь я понял
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|