Eclipse #include <Arduino.h>

    Всем привет!
    Недавно публиковались на GT пара статей против и за применения Arduino для чего-то более прибыльного, чем мигание лампочками и создание домашних метеостанций. Обычный такой дискурс из мира технологий, когда технологии становятся все более и более доступны широким слоям населения, плавали, знаем.
    Имея техническое образование и ВУЗовскую специальность непосредственно связанную с программированием микроконтроллеров, я понимаю тех кто против. А имея много лет опыта коммерциализации не только своих, но и в большей степени чужих знаний и навыков, я отлично понимаю тех кто за.
    Вы правы, и вы тоже правы, а истина, как всегда где-то рядом посередине.

    Прежде всего нужно понять о чем спор. Arduino это не только красиво упакованные итальянцами в печатные платы и коробочки микроконтроллеры, и не только среда разработки Arduino IDE. Прежде всего это библиотеки для быстрой разработки, и на мой взгляд именно они представляют наибольшую ценность. Если посмотреть на принципиальные схемы плат Arduino, то ничего особо впечатляющего мы не увидим. Среда разработки… Скажем так, немного не дотягивает до Borland C++ образца 1994 года.
    Как мы знаем, эти библиотеки распространяются по лицензии GNU, их можно брать и использовать не отчисляя лицензионных платежей их создателям. Такая модель бизнеса требует зарабатывать на чем-то еще, кроме лицензионных отчислений. Вот они и зарабатывают, производя и продавая в красивой упаковке за 20 баксов то, что инженер электронщик купит за 20 центов.
    И важно тут не то, что они такие алчные буржуи, обирающие трудовой народ и достойные порицания от всего прогрессивного человечества, а то, почему они могут так делать. Потому, что:
    • Оказались в нужное время в нужном месте и разглядели первыми те возможности, которые не увидели другие;
    • Сделали доступным для потребителя то, что раньше было доступно узкому кругу ограниченных лиц;
    • Красиво все упаковали и преподнесли потребителю в готовом к употреблению виде.


    Теперь о том, зачем и как скрещивать наработки потребительского сегмента занимательной электроники с циклом разработки коммерческого проекта. В этом цикле экосистема Arduino имеет одно весьма ценное свойство — скорость разработки.
    Скорость — это отношение пройденного расстояния ко времени. Чем больше скорость, тем быстрее мы сделаем работу или тем большую работу мы сделаем за отведенное нам время и гипотетически заработаем больше денег в единицу времени.

    Представьте, к Вам обратился заказчик, у него есть какие-то хотелки-требования, а у Вас нет в закромах Родины почти готового на 86% проекта со схожими функциональными характеристиками. У любого заказчика есть два Основных Вопроса:
    1. Сколько будет стоить?
    2. Когда будет готово?

    (очень часто на второй вопрос ему нужен ответ «вчера»)
    Ответ здорового программиста Ответ ардуинщика
    Нам нужно провести предпроектное исследование, составить техническое задание, провести ряд итераций по его уточнению и после его утверждения мы скажем через сколько месяцев мы будем готовы представить Вам первый прототип для дальнейшего уточнения функциональных требований и характеристик изделия. Завтра я представлю Вам прототип, как я его вижу, и мы обсудим детали. Стоимость готового изделия при тираже M штук будет от X до Y и потребуется примерно Z недель.

    По опыту коммерческой деятельности осмелюсь утверждать, что заказчик выберет путь курильщика ардуинщика.

    Далее о том как использовать Arduino для своих корыстных целей, с блэкджеком и групповой разработкой, контролем версионности, документированием проекта и прочими чучелами-лебедями из мира коммерческой разработки.
    На самом деле все очень просто. Для этого, не считая разработчиков, нужна среда разработки и стенд на котором они смогут разрабатывать. C++, он и в Африке C++, AVR и в Arduino остается AVR.

    В качестве среды рассмотрим Eclipse. Вот тут очень хорошая статья о том, как настроить Eclipse сначала на работу с AVR Toolchain, а потом подключить библиотеки Arduino и замигать светодиодом на Uno. А вот тут еще лучше, но на английском.
    Я немного дополню их кое-какими граблями, на которые наступил, возможно кому-то это сэкономит пару часов времени.
    Все нижеследующее описано для Линукса и Leonardo. Для Винды нужно предварительно установить MinGW/msys.

    Для сборки всех исходников, входящих в ядро Arduino нужно правильно выставить константы препроцессора. Если посмотреть исходный код библиотек, то можно увидеть множество структур условной компиляции #ifdef #else #endif. В статье по ссылке автор на все это забил, взяв готовый .a файл скомпилированный Arduino IDE. Но в ядро попадают не все библиотеки, например, SPI и Ethernet не попадают, а в них нас ждут такие же приколы с условной компиляцией.
    Выяснить какие константы и как установить можно очень просто.
    1. Запускаем Arduino IDE
    2. Выбираем плату, которую используем в качестве стенда
    3. Файл — Настройки — Показывать подробный вывод — Компилятор
    4. Запускаем компиляцию и внимательно читаем консоль, ищем строки вида
      *** avr-g++ -c -g -Os -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics  -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_LEONARDO -DARDUINO_ARCH_AVR  -DUSB_VID=0x2341 -DUSB_PID=0x8036 '-DUSB_MANUFACTURER="Unknown"' '-DUSB_PRODUCT="Arduino Leonardo"' ***
      

      Все, что указано с ключом -D (кроме F_CPU, его Eclipse добавит сама) надо добавить в настройках компилятора в Eclipse.


    Что бы компилятор нашел все .h файлы, которые мы захотим использовать в проекте нужно указать к ним путь в настройках. Тут есть два способа. Можно указать абсолютные пути к папкам Arduino IDE или прилинковать библиотеку к проекту и указывать относительный путь от {workspase}/{ProjName}. Второй способ позволит компилировать ядро в Eclipse, хотя принципиальной разницы нет, и в Arduino IDE и в Eclipse за компиляцию отвечает avr-g++.
    Дополнительно указываем путь к pins_arduino.h для той платы, которую используем в проекте.

    Дабы не нарушать стройной структуры файлов библиотеки main.cpp из нее править не будем. Просто включим его как есть из ядра в проект, а свой файл назовем каким-нибудь другим именем. Объявлять в нем функцию main() не нужно, она уже есть в main.cpp, инициализирует все что нужно и в бесконечном цикле вызывает функцию loop(), линковщик соберет все как надо.

    Среда готова к работе. Пишем примерно так же как в Arduino IDE, но тут немного строже следят за соблюдением канонов C++. И в любой момент можем спустится от высокоуровневого программирования на этаж ниже. Если не хватает скорости работы с портами через digitalWrite — пишем напрямую в порты.
    Увы, привычку завешивать процессор вызовом
    delay(5000);
    Eclipse не лечит. Этому учат где-то то ли в старших классах школы, то ли младших курсах ВУЗа, это настолько глубоко проникает в личность, что никакие нравоучения не могут наставить человека на путь истинный.

    Для заливки и Arduino IDE и Eclipse используют утилиту-программатор AVRDude. Платы типа Uno она действительно знает под именем «arduino», а вот более дешевые типа Leonardo она категорически под этим именем узнавать отказывается.
    Идем в boards.txt и узнаем, что для программатора
    leonardo.upload.protocol=avr109

    Программатор в настройках AVRDude называется «Atmel AppNote AVR109 Boot Loader», вот он:

    Небольшое неудобство только в том, что Eclipse не будет делать вот этого
    leonardo.upload.use_1200bps_touch=true

    Придется ручками нажимать reset перед загрузкой.

    Ну и в заключении один и тот же проект, собранный в Arduino IDE
    Скетч использует 28 432 байт (99%) памяти устройства. Всего доступно 28 672 байт.
    Глобальные переменные используют 1 254 байт (48%) динамической памяти, оставляя 1 306 байт для локальных переменных. Максимум: 2 560 байт.

    и в Eclipse
    Invoking: Print Size
    avr-size --format=avr --mcu=atmega32u4 EthernetController.elf
    AVR Memory Usage
    ----------------
    Device: atmega32u4

    Program: 27834 bytes (84.9% Full)
    (.text + .data + .bootloader)

    Data: 1257 bytes (49.1% Full)
    (.data + .bss + .noinit)

    Finished building: sizedummy

    Пустячок, а для для доделки как раз эти полкило и не хватает.
    Поделиться публикацией

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

      0
      Было бы интересно узнать, за счёт чего получился меньший размер скетча. Более удачная оптимизация, или просто часть библиотек выкинута?

      Кстати, интересно так же было бы сравнить, сколько займёт тот же скетч, скомпилированный под visual studio. Там-то приличная ide была доступна ещё пять лет назад, причём, судя по статье, без пляски с бубнами.

      И вот ещё одна статья про ардуино с эклипсом, если у кого не хватило или не получилось повторить по этой.


      Насчёт оригинальной arduino ide — она меня ввела в некоторый ступор тем, что в скомпилированный скетче оказался код, который нигде не подключается, а просто лежит в той же директории...
        0
        Я именно на эту статью ссылался в своей, моя как раз ее дополняет.
        Если VS собирает проект через ту же AVR toolchain, то скорее всего получится столько же.
        Дело, как мне кажется, в работе линковщика, он выбрасывает все лишнее. Ключ -Os за прошедшие 5 лет с момента написания первой статьи появился и в Arduino IDE.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое