sonycman 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба Вот что у меня теперь: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 24 ноября, 2008 Опубликовано 24 ноября, 2008 · Жалоба Добавьте -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? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 (изменено) · Жалоба -ff-sections заставляет компилятор размещать код каждой функции в отдельной секции памяти. -gc-sections заставляет компоновщик удалять все секции кода, на которые нет ссылок из других секций. в итоге все функции, которые в тексте определены, но ни разу не вызваны, удаляются из результирующего кода, чем уменьшается его размер. -Wl, - это опция, которая указывает, что компоновщику надо передать список следующих опций (список разделяется запятыми). При этом в списке недопустимы пробелы, которые обозначают конец списка. Именно по этому лучше тупо писать -Wl,-gc-sections , чем добавлять опции к командной строке иными способами. для Eclipse Ganimed (которым я и сам пользуюсь) имеется плагин, специально предназначенный для работы с AVR, по-моему, он называется avreclipse. Этот плагин имеет "очеловеченный" интерфейс к avr-gcc, который позволяет большинство опций задавать "галочками", а для остальных есть поля ручного ввода. При ручном вводе опции просто добавляются, проблем не возникает. И никаких заморочек с make-файлами, все автоматически делается. Рекомендую. P.S. по непонятным причинам, результат компиляции одного и того же проекта с одинаковыми (во всяком случае, с моей точки зрения) опциями в AVR Studio и Eclipse получается (у меня) разным! Второй - меньшего размера :) подозреваю, что дело в том, в каком порядке компилируются файлы проекта (порядок реально разный получается)... Изменено 25 ноября, 2008 пользователем ARV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба Так выдаёт ошибку: 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? :rolleyes: Для того, что бы удалялись неиспользуемые функции -ffunction-sections надо передавать компилятору, а --gc-sections -- линкеру/компоновщику. А ошибка в том, что вы забыли "-" перед Wl,-gc-sections Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба Для того, что бы удалялись неиспользуемые функции -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 байт! Надо проверить, что он там повыкидывал... :yeah: ЗЫ: а ничего, что --relax передаётся без запятой? -ff-sections заставляет компилятор размещать код каждой функции в отдельной секции памяти. -gc-sections заставляет компоновщик удалять все секции кода, на которые нет ссылок из других секций. в итоге все функции, которые в тексте определены, но ни разу не вызваны, удаляются из результирующего кода, чем уменьшается его размер. -Wl, - это опция, которая указывает, что компоновщику надо передать список следующих опций (список разделяется запятыми). При этом в списке недопустимы пробелы, которые обозначают конец списка. Именно по этому лучше тупо писать -Wl,-gc-sections , чем добавлять опции к командной строке иными способами. для Eclipse Ganimed (которым я и сам пользуюсь) имеется плагин, специально предназначенный для работы с AVR, по-моему, он называется avreclipse. Этот плагин имеет "очеловеченный" интерфейс к avr-gcc, который позволяет большинство опций задавать "галочками", а для остальных есть поля ручного ввода. При ручном вводе опции просто добавляются, проблем не возникает. И никаких заморочек с make-файлами, все автоматически делается. Рекомендую. Спасибо за разъяснение. У меня установлен именно avreclipse плагин, версии 2.3.0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба Надо проверить, что он там повыкидывал... :yeah:практика показывает, что ничего полезного не выкидывает :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
msalov 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба Линкер: 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 байт! Надо проверить, что он там повыкидывал... :yeah: ЗЫ: а ничего, что --relax передаётся без запятой? Ничего страшного, по моим представлениям запись вида -Wl,--gc-sections вместо --gc-sections используется лиш в случае совмещения компиляции и скомпоновки, аналогично и --relax, и -Map и все остальные параметры компоновщика. Что бы проверить, какие секции были выкинуты сборщиком мусора, можно добавить параметр --print-gc-sections Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 · Жалоба практика показывает, что ничего полезного не выкидывает :) Проверил - всё в порядке, выкинул только не используемые функции :) Прекрасно! Ничего страшного, по моим представлениям запись вида -Wl,--gc-sections вместо --gc-sections используется лиш в случае совмещения компиляции и скомпоновки, аналогично и --relax, и -Map и все остальные параметры компоновщика. Что бы проверить, какие секции были выкинуты сборщиком мусора, можно добавить параметр --print-gc-sections А я уже листинги сравнил тотал коммандером :laughing: Понятно, значит, --relax оставляю как есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 25 ноября, 2008 Опубликовано 25 ноября, 2008 (изменено) · Жалоба Привет, sonycman! Также в коде есть одна немаленькая inline функция, которая используется всего один раз (и то, понятно, инлайнится в тело вызывающей функции), но непонятно, почему остаётся её вторая копия?Можно тестовый пример с версией и опциями компилятора? За короткое время знакомства с GCC понравилось: удобная реализация атомарности через макросы ATOMIC_BLOCK(), удобная обёртка для обработчиков прерываний вида ISR(vector_name){}.Так это как раз не компилятор, это просто библиотечные макросы. Аналогичные макросы можно сделать для любого минимально вменяемого компилятора. Видно, что для деления вызывается подпрограмма библиотеки. Почему не используется простой сдвиг? Видимо, потому что простой сдвиг не умещается в три процессорные инструкции. При отличной от -Os оптимизации генерится именно сдвиг. А где можно почитать про флаги для оптимизации?В документации, естественно: http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gc...ptimize-Options А что вообще означают опции Wl и -gc-sections?Все описано в мануалах. Про эти две тебе уже ответили, но в мануалах есть еще не один десяток опций, о которых полезно знать... Я обычно ручками пишу <<1 (2,3,etc) или >>1, не надеясь на компилятор.И зря. "x / 2" и "x >> 1" - не эквивалентные операции. Они дают гарантированно одинаковый результат только для положительного x. Но в этом случае (если x имеет тип unsigned) gcc и код генерит одинаковый (со сдвигом), и нет никакого смысла писать одно вместо другого. У sonycman же, судя по приведенному им примеру, левый операнд имеет знаковый тип. Изменено 25 ноября, 2008 пользователем alx2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба Понятно, значит, --relax оставляю как есть.на сколько я смог понять их документации, --relax для платформы AVR смысла не имеет. экспериментальная проверка на своем проекте подтвердила - 0 байт изменений с и без --relax Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aesok 0 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба на сколько я смог понять их документации, --relax для платформы AVR смысла не имеет. экспериментальная проверка на своем проекте подтвердила - 0 байт изменений с и без --relax На каком контроллере Вы проверяли, размер программы? Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба На каком контроллере Вы проверяли, размер программы? Анатолий. проверял на контроллере AT90CAN128, программа в итоге получается 14606 байт. всего линкуется почти десяток объектников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба Привет, 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. Именно в этом, видимо, и вся проблема. Спасибо, теперь я понял :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 26 ноября, 2008 Опубликовано 26 ноября, 2008 · Жалоба И зря. "x / 2" и "x >> 1" - не эквивалентные операции. Они дают гарантированно одинаковый результат только для положительного x. Да ну? Где Вы это вычитали? Сдвиг в Си для знаковых операндов всю жизнь был арифметический, с учетом знака. А вот то, что гнусь не поставил команду ASR, а позвал деление - это непонятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться