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

 
 
10 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы...
sonycman
сообщение Nov 24 2008, 20:23
Сообщение #31


Любитель
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2008, 21:14
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 24 2008, 23:36
Сообщение #33


Любитель
*****

Группа: Свой
Сообщений: 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? rolleyes.gif
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 25 2008, 05:56
Сообщение #34


Профессионал
*****

Группа: Свой
Сообщений: 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 получается (у меня) разным! Второй - меньшего размера smile.gif подозреваю, что дело в том, в каком порядке компилируются файлы проекта (порядок реально разный получается)...

Сообщение отредактировал ARV - Nov 25 2008, 06:02


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
msalov
сообщение Nov 25 2008, 07:39
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 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? rolleyes.gif

Для того, что бы удалялись неиспользуемые функции -ffunction-sections надо передавать компилятору, а --gc-sections -- линкеру/компоновщику.
А ошибка в том, что вы забыли "-" перед Wl,-gc-sections
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 25 2008, 09:41
Сообщение #36


Любитель
*****

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



Цитата(gotty @ Nov 25 2008, 11:39) *
Для того, что бы удалялись неиспользуемые функции -ffunction-sections надо передавать компилятору, а --gc-sections -- линкеру/компоновщику.
А ошибка в том, что вы забыли "-" перед Wl,-gc-sections


Спасибо. Просто мне посоветовали -ffunction-sections тоже передать линкеру smile.gif

В общем - сделал вот так:
Компилятор:
Код
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.gif

ЗЫ: а ничего, что --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.
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 25 2008, 09:52
Сообщение #37


Профессионал
*****

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



Цитата(sonycman @ Nov 25 2008, 12:41) *
Надо проверить, что он там повыкидывал... yeah.gif
практика показывает, что ничего полезного не выкидывает smile.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
msalov
сообщение Nov 25 2008, 10:01
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 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 байт!
Надо проверить, что он там повыкидывал... yeah.gif

ЗЫ: а ничего, что --relax передаётся без запятой?

Ничего страшного, по моим представлениям запись вида -Wl,--gc-sections вместо --gc-sections используется лиш в случае совмещения компиляции и скомпоновки, аналогично и --relax, и -Map и все остальные параметры компоновщика.
Что бы проверить, какие секции были выкинуты сборщиком мусора, можно добавить параметр --print-gc-sections
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 25 2008, 10:42
Сообщение #39


Любитель
*****

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



Цитата(ARV @ Nov 25 2008, 13:52) *
практика показывает, что ничего полезного не выкидывает smile.gif

Проверил - всё в порядке, выкинул только не используемые функции smile.gif
Прекрасно!

Цитата(gotty @ Nov 25 2008, 14:01) *
Ничего страшного, по моим представлениям запись вида -Wl,--gc-sections вместо --gc-sections используется лиш в случае совмещения компиляции и скомпоновки, аналогично и --relax, и -Map и все остальные параметры компоновщика.
Что бы проверить, какие секции были выкинуты сборщиком мусора, можно добавить параметр --print-gc-sections

А я уже листинги сравнил тотал коммандером laughing.gif
Понятно, значит, --relax оставляю как есть.
Go to the top of the page
 
+Quote Post
alx2
сообщение Nov 25 2008, 21:58
Сообщение #40


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 26 2008, 07:22
Сообщение #41


Профессионал
*****

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



Цитата(sonycman @ Nov 25 2008, 13:42) *
Понятно, значит, --relax оставляю как есть.
на сколько я смог понять их документации, --relax для платформы AVR смысла не имеет. экспериментальная проверка на своем проекте подтвердила - 0 байт изменений с и без --relax


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 26 2008, 09:39
Сообщение #42


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



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


На каком контроллере Вы проверяли, размер программы?

Анатолий.
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 26 2008, 09:50
Сообщение #43


Профессионал
*****

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



Цитата(aesok @ Nov 26 2008, 12:39) *
На каком контроллере Вы проверяли, размер программы?

Анатолий.

проверял на контроллере AT90CAN128, программа в итоге получается 14606 байт. всего линкуется почти десяток объектников.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 26 2008, 10:17
Сообщение #44


Любитель
*****

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



Цитата(alx2 @ Nov 26 2008, 01:58) *
Привет, sonycman!
Можно тестовый пример с версией и опциями компилятора?

Привет smile.gif
Сейчас у меня вот такие опции:
Компилятор:
Код
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. Именно в этом, видимо, и вся проблема. Спасибо, теперь я понял smile.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 26 2008, 12:46
Сообщение #45


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(alx2 @ Nov 25 2008, 23:58) *
И зря. "x / 2" и "x >> 1" - не эквивалентные операции. Они дают гарантированно одинаковый результат только для положительного x.

Да ну? Где Вы это вычитали? Сдвиг в Си для знаковых операндов всю жизнь был арифметический, с учетом знака.

А вот то, что гнусь не поставил команду ASR, а позвал деление - это непонятно.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post

10 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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