Как стать автором
Обновить

Комментарии 20

и неизбежно приходят к необходимости модификации самих библиотек под свои специфические нужды проекта.
А один раз модифицировав системную библиотеку
— можно не продолжать.
Я и не знал, что ТАК можно.
Тоже не понял этого момента. Если ты меняешь что то в библиотеке, ее нужно форкнуть и работать уже непосредственно с ней, а тут сами себе проблемы создали.
Здесь речь даже не доходит до проблем с модифицированными библиотеками, здесь речь идёт о том, что Ардуино версии 1.6.5 содержит Ethernet библиотеку версии 1.0.4, содержащую 31 файл и занимающую 123 КБ памяти и Ардуино версии 1.6.7 содержит Ethernet библиотеку версии 1.0.4, содержащую 31 файл и занимающую 123 КБ памяти. Но это разные библиотеки и несовместимые между собой.

И речь идёт о том, что Ардуино преследует только одну цель — собрать непротиворечивый дистрибутив, а какой при этом будет устроен ад из библиотек — не важно.

Ардуино модифицирует системные библиотеки под версии своих IDE и даже не удосуживается формально изменить номер версии. И там и там — 1.0.4 (а библиотеки кардинально разные).
Что такое — библиотеки кардинально разные?
Разные модули, разные вызовы, разная функциональность?
Если изменилась реализация, а интерфейс и функционал остался прежним, то в чем проблема? В этом и смысл библиотек.
Вот если меняется интерфейс, то тогда, конечно, это недопустимо, но все-таки именно в этом дело?
Вы сами написали про модификацию системных библиотек, это не я придумал.
Система Ардуино открытая и вы сами можете проанализировать внесённые разработчиками изменения. Мне ни их логика, ни их мотивация непонятны. Особенно мне непонятно, почему две разных библиотеки имеют один и тот же номер версии. И почему одна библиотека 1.04 компилируется только в 1.6.5, а другая 1.0.4 компилируется только в 1.6.7.

Я то думал, у Вас хватит терпения сравнить все файлы из двух библиотек и показать, что же не там такого марио начудил, вникнуть в суть проблемы так сказать, а это просто поток эмоций с примитивным мануалом по Контралцэ контралвэ. Не стыдно такие статьи писать в топовое из русских IT сообщество?
Кстати, что у Вас с лицензией на АМС, могу я ваши исходники юзать для своих проектов не всегда частных?)

Как перестать использовать Arduino IDE и начать писать для Arduino на C под Linux:

1) устанавливаем gcc-avr, avr-libc, avrdude

2) Пишем код. Например:

#include <avr/io.h>

main() {
DDRD |= 1<<7; // настраиваем порт D, пин 7 на выход
PORTD |= 1<<7; // посылаем туда 1
}


3) Собираем:
avr-gcc -mmcu=atmega644pa -Os -o 1.o 1.c # естественно, здесь нужно подставить вашу модель МК вместо atmega644pa
avr-objcopy -O ihex 1.o 1.hex

4) Бэкапим заводскую прошивку:
avrdude -p m644p -c arduino -P /dev/ttyUSB0 -v -U flash:r:arduino_flash_factory.hex:i # не забываем поменять модель МК. Понять куда подключён программатор можно вызвав dmesg | tail после подключения платы к ПК

5) Зашиваем новую:
avrdude -p m644p -c arduino -P /dev/ttyUSB0 -v -U flash:w:1.hex

Для входа в терминальный режим avrdude (если нужно) используем:
avrdude -p m644p -c arduino -P /dev/ttyUSB0 -v -t

6) Читаем man avrdude и http://www.nongnu.org/avr-libc/user-manual/pages.html
А теперь сравните Вашу процедуру со стандартной в среде Ардуино, и поймете, почему народ не стремится «бэкапить прошивки и зашивать новые, а также читать мануалы».
Я честно не могу понять, почему в -nix не могут сделать нормальные процедуры, ну хотя бы с использованием bash.
Не то, чтобы я не мог ввести в консоли команду dmesg, но, блин, почему я должен это делать?
https://sourceforge.net/projects/avrdude-gui/
http://blog.zakkemble.co.uk/avrdudess-a-gui-for-avrdude/
Ну так можно найти/написать Makefile, который всё это будет делать за вас, а вам останется только поправить код и сделать make build && make deploy.

Если есть аллергия на консоль, есть Eclipse, под который давно сделаны нужные плагины для работы с AVR (и, да, там есть отладчик, хоть для Arduino это не актуально). Ну или Atmel Studio.

Вообще не представляю, как можно писать хоть сколько-нибудь серьёзные проекты в Arduino IDE. А уж тем более их после этого поддерживать.
Непонятно, кто именно не может сделать «нормальные процедуры»?
Желающие могут поставить себе родную Arduino IDE и наслаждаться всеми ее «прелестями». Желающие могут пойти по красноглазому «только консоль, только хардкор». Желающие — написать Makefile или скрипт и пользоваться «любимым текстовым редактором», «любимой IDE», да хоть преферансом и поэтессами. И да, один раз вытащив все нужные библиотеки можно будет навсегда позабыть про кривое версионирование «от авторов» и большинство остальных проблем, связанных с кривыми руками поставщика.
2) Пишем код. Например:

#include

main() {
DDRD |= 1
2) Пишем код. Например:

#include <avr/io.h>

main() {
DDRD |= 1<<7; // настраиваем порт D, пин 7 на выход
PORTD |= 1<<7; // посылаем туда 1
while();
}
Вы довольно красочно описали то, что было и так ясно: «Что-то поломали в новой версии, надо чинить». Где грязные подробности, что именно поломалось? И в чем поломка?
Не понял вопроса. Описал механизм формирования дистрибутивов сред разработки Ардуино и дал практические рекомендации, как заставить работать проект, если он не компилируется в новой версии IDE.
Если что то изменилось в библиотеке не стоит сходу возвращать старую — сначала нужно понять «Марио», за каким он сделал эти изменения. Изменения нужно вносить у себя в коде. Прричем код нужно разделить директивами прекомпайлера. Сам не фанат Ардурины, поэтому сказать точно не могу, какие дефайны нужно использовать для определения версии IDE, но уверен, что они есть. Иначе, грозит ситуация, когда вы скачиваете с git очередной проект, а он просто не запускается. А вам нужно последовательно шаг за шагом скачать все версии IDE и пытаться поменять библиотеку.

Если хотите этого избежать — программируйте на C или C++ без использования фреймворка. Для этого ничего делать не нужно: код можно прямо в файле ino прописать. Это я и делаю чаще всего для простого прототипирования.

Если же вам охота использовать всяческие методы с make-файлами — пожалуйста. В Arduino уже лежит последняя версия avr-gcc и avrdude. Нужно только пути правильно в make-файле прописать.
А зачем вообще скакать из версии к версии?
Есть стабильная 1.6.5. До этого была, например 1.0.7 на которой все работало.
Ничего принципиально нового без чего нельзя жить в 1.6.7 не появилось.
Сторонние библиотеки (по крайней мере нормально написанные типа Адафруитовских) довольно толерантны к разным версиям.
Всё не так просто, например, плата Genuino 101 работает только с версией Arduino IDE 1.6.7 и выше. Без вариантов — хочешь перенести АМС на Genuino 101 — умудрись скомпилировать проект в среде 1.6.7. А там всё изменено по произволу программистов Ардуино на уровне библиотек (что плохо, но терпимо), а также на более глубоком уровне системных файлов среды (с чем бороться вообще невозможно).

Отсюда и предложенное практическое решение как откомпилировать проект в любой версии IDE, несмотря на любые «закидоны» программистов Ардуино.
А возможно сделать сравнительный анализ какие именно библиотеки модифицируются:
сделать табличку — например базовая 1.5 — версия 1.6.5 изменены следующие библиотеки
1.-Ethernet
2.
3.
В том то всё и дело, что модификация библиотек и системных файлов носит тотальный и субъективный характер. Пытаться предугадать, что они изменят в следующей версии и пытаться каталогизировать изменения не имеет смысла.

Разумным решением, на мой взгляд, является понимание их целей и логики их поведения и простое и эффективное противодействие этому — нашли работающую библиотеку, перенесли в проект и модифицировали, если нужно — просто и эффективно.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории