Comments 30
Отличная статья. Спасибо автору.
Я и сам заказал BlackWidow на неделе. Пока прикручиваю SDK к xCode, если не получится Еклипс на очереди.
Я и сам заказал BlackWidow на неделе. Пока прикручиваю SDK к xCode, если не получится Еклипс на очереди.
0
Не понял только, зачем использовать avr-g++ вместо avr-gcc — проект вроде на чистом Си?
0
оо хорошая статья, спасибо, давно хотел, но руки недоходили
0
а сразу вопрос, почему получился более компактный выходящий HEX?
0
Пока еще не разобрался, хотя он меньше на пару байт всего. Думаю настройки для линкера другие в оригинальной IDE.
0
просто встречал (в том числе и на хабре) что код получаемый оригинальной де, избыточен сильно…
0
я ассемблер еще не смотрел, у меня после настройки линкера код стал меньше… потом пробовал крутить компилятор но он не сильно влияет на размер hexa.
0
спасибо, значит надо поискать получше… мб и найду чего
0
А можно вопрос? А что, конкретно, вы пытаетесь найти?
0
откуда появляется разница в размере генерируемого HEX
robocraft.ru/blog/arduino/116.html
вот сдесь пишут под авр процессор с учетом ардуии (если я правильно понял) и получается колосальная разница
Компилируем, загружаем в протеус – работает!
Сравним размеры файлов :)
Ардуиновский Blink.hex весит 2031 байт
Наш hex при оптимизации по размеру (OPT = s) по размеру весит 410 байт
robocraft.ru/blog/arduino/116.html
вот сдесь пишут под авр процессор с учетом ардуии (если я правильно понял) и получается колосальная разница
Компилируем, загружаем в протеус – работает!
Сравним размеры файлов :)
Ардуиновский Blink.hex весит 2031 байт
Наш hex при оптимизации по размеру (OPT = s) по размеру весит 410 байт
+1
Скорее всего в родной среде выключена оптимизация.
+1
По первой же ссылке в гугле:
sourceware.org/ml/crossgcc/2003-12/msg00171.html
Смысл в том, что те функции которые не вызываются, не включаются в исходный бинарник.
Решил проверить =>
добавил в свой makefile строчки для компилятора -ffunction-sections и -fdata-sections
![](https://habrastorage.org/r/w1560/storage/c3015bf7/9ee91dde/830c6e95/ceca1c44.png)
ну и конечно -Wl,-gc-sections для линкера:
![](https://habrastorage.org/r/w1560/storage/b4973d33/0eeedcc7/54e0d843/4badf9c0.png)
Ну и написал соответственно простенькую прогу с функцией, -gc-sections пока закомментил.
Откомпилил:
![](https://habrastorage.org/r/w1560/storage/1012741a/8f725f9d/ea1d7aa4/9455dff3.png)
Раскомментил -gc-sections, откомпилил:
![](https://habrastorage.org/r/w1560/storage/ff407b95/a8db091a/42b19f26/1fcca493.png)
Добавил вторую функцию, -gc-sections пока закомментил.
Откомпилил:
![](https://habrastorage.org/r/w1560/storage/50dc77b1/945b8497/f8c0ab37/e58dcd1b.png)
Раскомментил -gc-sections, откомпилил:
![](https://habrastorage.org/r/w1560/storage/584a750a/7b0cecdc/505b4213/54194c3e.png)
Так же я так понимаю, что --cref тоже должен быть, для построения связей, и определения используемых функций.
Собственно исходники: Gdocs
sourceware.org/ml/crossgcc/2003-12/msg00171.html
Смысл в том, что те функции которые не вызываются, не включаются в исходный бинарник.
Решил проверить =>
добавил в свой makefile строчки для компилятора -ffunction-sections и -fdata-sections
![](https://habrastorage.org/storage/c3015bf7/9ee91dde/830c6e95/ceca1c44.png)
ну и конечно -Wl,-gc-sections для линкера:
![](https://habrastorage.org/storage/b4973d33/0eeedcc7/54e0d843/4badf9c0.png)
Ну и написал соответственно простенькую прогу с функцией, -gc-sections пока закомментил.
Откомпилил:
![](https://habrastorage.org/storage/1012741a/8f725f9d/ea1d7aa4/9455dff3.png)
Раскомментил -gc-sections, откомпилил:
![](https://habrastorage.org/storage/ff407b95/a8db091a/42b19f26/1fcca493.png)
Добавил вторую функцию, -gc-sections пока закомментил.
Откомпилил:
![](https://habrastorage.org/storage/50dc77b1/945b8497/f8c0ab37/e58dcd1b.png)
Раскомментил -gc-sections, откомпилил:
![](https://habrastorage.org/storage/584a750a/7b0cecdc/505b4213/54194c3e.png)
Так же я так понимаю, что --cref тоже должен быть, для построения связей, и определения используемых функций.
Собственно исходники: Gdocs
+3
О самом устройстве напишите?
0
Вот за такие статьи я и люблю Хабр.
Кстати, возник вопрос: каким образом скомпилированная программа заливается на Ардуино? В настроеном IDE есть кнопочка? Или автоматом, после билда происходит заливка? Или нужно ручками заливать?
Кстати, возник вопрос: каким образом скомпилированная программа заливается на Ардуино? В настроеном IDE есть кнопочка? Или автоматом, после билда происходит заливка? Или нужно ручками заливать?
0
Для владельцев Arduino Duemilanove: чтобы скомпилированный hex-файл залился в контроллер через AVRDude, необходимо в его настройках установить частоту передачи данных 57600 bod (в Eclipse — пункт меню Window -> Preferences -> AVR -> AVR Dude, выбрать свою конфигурацию и нажать Edit, в поле ввода «Override default baudrate» установить значение 57600). С частотой, указанной в статье, возникала ошибка доступа к контроллеру (и при попытке заливки прошивки, и при попытке считать тип контроллера и кварца).
Также маленькое дополнение — чтобы не подсвечивалось предупреждение на extern «C» — нужно в самом начале создавать не проект C, а проект C++, и все настройки, которые в статье описаны для компилятора C, устанавливать также и для компилятора C++.
Также маленькое дополнение — чтобы не подсвечивалось предупреждение на extern «C» — нужно в самом начале создавать не проект C, а проект C++, и все настройки, которые в статье описаны для компилятора C, устанавливать также и для компилятора C++.
0
Для Ubuntu 10.04 понадобиться пакет eclipse-pde.
У меня Mega 2560. По кнопке «Load from MCU» ругается, что не может распознать ответ. По светодиодам видно, что обмен даными происходит, затем железка перезапускается. Указал вручную «ATmega2560». Жму «билд» получаю:
Type unrecognised emulation mode...
Пробовал другие значения, в том числе и ATmega328P. Ошибка сохраняется.
У меня Mega 2560. По кнопке «Load from MCU» ругается, что не может распознать ответ. По светодиодам видно, что обмен даными происходит, затем железка перезапускается. Указал вручную «ATmega2560». Жму «билд» получаю:
Type unrecognised emulation mode...
Пробовал другие значения, в том числе и ATmega328P. Ошибка сохраняется.
0
Очень хорошо, что научились собирать для avr из eclipse. В eclipse хороший текстовый редактор и отличная навигация по коду.
Вот бы ещё методичку как собирать прошивки для avr из самописных makefile.
0
Sign up to leave a comment.
Настройка Eclipse для работы с Arduino Uno