Размышления: IDE для Arduino / Wiring vs Pure C

Тема в разделе "Флудилка", создана пользователем Rx, 17 сен 2012.

?

Я предпочитаю:

  1. Wiring

    18 голосов
    56,3%
  2. Pure C

    14 голосов
    43,8%
  1. Rx

    Rx Нерд

    2000px-arduino_iconsvg-285x.png
    Всем уже известно, что дефолтная среда для Arduino считается, как ни странно, Arduino IDE, которая, к сожалению, не лишёна недостатков и стоит на втором месте после notepad.exe. Причин этому много: низкая скорость компиляции, крайне убогий интерфейс, малая функциональность, вернее, её отсутствие и, самое раздражающее, создание новых окон для каждого скетча. К счастью, в настоящее время проблема решена, и каждый желающий может выбрать себе подходящий продукт: Visual Micro for Visual Studio, Programmers Notepad (WinAVR), AVR-Plugin for Eclipse, CodeBlocks / ArduinoDev CodeBlocks и другие. Если вы так же пришли к мнению о том, что Arduino IDE вас не устраивает, то готов посоветовать вам замечательную среду для программирования – CodeBlocks. Опенсурс, удобный, тёплый и ламповый. Хватило совсем немного времени, чтобы разобраться и полностью настроить среду под себя, поэтому, не думаю, что даже у новичка могут возникнуть проблемы в настройке, так как изначально поддержка компилятора AVR-GCC с подключением стандартных Ардуиновских библиотек в CodeBlocks уже имеется, и это огромный плюс. Напоследок, в качестве Serial Monitor рекомендуется использовать Realterm. Возможностей у него куда больше монитора в стандартной среде Arduino.

    Code-Blocks_10.png
    Теперь, поподробнее о AVR-GCC. По-умолчанию, в среде Arduino IDE используется приближенный к C/C++ язык программирования устройств, которого только с помощью множества готовых библиотек прозвали Wiring. Что такое Wiring? Это light-версия Си. Без библиотек вы получите «Чистый Си» (дальше «Pure C»), ведь компиляция, так или иначе, происходит с помощью единственного инструмента под названием AVR-GCC (входит в комплект Arduino IDE, WinAVR). Несомненно, с библиотеками, программировать проще – облегчают синтаксис и понимание кода, однако, бытует мнение, что начав работать с подобной light-версией C/С++ есть шанс привыкнуть к Wiring человеку, который ни разу не сталкивался с программированием вовсе. Как говорится, можно ничего не делать, а всё уже есть, достаточно лишь подключить нужный инвентарь, немного кода и работа завершена, за что, кстати, «Ардуинщиков» так, оказывается, и не любят. Примеров подобных «взаимоотношений» достаточно много, далеко ходить не надо – есть знаменитый Хабр и снова Он, есть специализированные места, вроде AVRFreaks.

    Хотелось бы так же упомянуть в нескольких словах о Bascom-AVR, который имеет в своём наличии готовый IDE и компилятор Basic для семейства МК AVR. Удовольствие не из бесплатных – 89 евро. А ещё можно писать программы для AVR на Ассемблере, но это уже достойно отдельного разговора, которого я, тем более, не понимаю.

    В самом начале, ещё перед покупкой Ардуины, в свободное время изучал, как наши, так и забугорные форумы на интересующие темы, и с вопросом: «Wiring или Чистый Си?» я сталкивался не раз. Как правило, в топиках подобного рода доходило до холивара, и сейчас объясню почему:


    Вспомним всеми любимый Blink.c. Так это написано на Wiring.

    Код (Text):
    int ledPin = 13;
    void setup()
    {
      pinMode(ledPin, OUTPUT);
    }
    void loop()
    {
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);
      delay(1000);
    }

    Коротко и понятно, после компиляции программа занимает около не много, не мало - 2048 кбайт. Время компиляции – около 2-х или 3-х секунд. Отлично, а так это может выглядеть на «Pure C»:

    Код (Text):
    #include <avr/io.h>
    #include <util/delay.h>
    void delay()
    {
      unsigned char counter = 0;
      while (counter != 50)
      {
        _delay_loop_2(30000);
        counter++;
      }
    }
    int main(void)
    {
      DDRB |= (1<<PB5);
      while (1)
      {
        PORTB |= (1<<PB5);
        delay();
        PORTB &= ~(1<<PB5);
        delay();
      }
      return 0;
    }

    Сложно для усвоения на первое время без использования датащита или, хотя бы, использования переменных, но, внимание, скомпилированный код занимает всего лишь (!) ~450 байт, время компиляции составляет ~100 мсек, c связке с AVRDude - ~200 мсек. Почему? Потому что мы выбрали только необходимые для себя библиотеки, их две – io.h и делай.h, в Wiring (на примере ArduinoDev CodeBlocks) – изначально по-умолчанию их подключено больше 10-и, что, как я уже говорил, облегчает понимание кода, но и не только.

    Всё рационально, хотите максимально быстрый, удобный и дружественный код – будете платить килобайтами. Иначе – код становится до ужаса непонятным, на разбор которого отнимет времени больше для того, кто не имел дело с Си, но, тем самым, получает на выходе более экономичный бинарник и владеет в своём распоряжении более мощными инструментами для программирования – это факт.

    Теперь вернёмся к сути. Основная проблема здесь, как и для другого любого новичка, выбрать, по какой дороге ему идти, в каком направлении развиваться. В сторону изучения облегчённого Си-подобного языка, в худшем случае, с возможностью привыкания к Wiring, используя лишь готовые библиотеки, но непонимания полноценной структуры работы МК, внешних устройств, либо сразу по «хардкору», начав курить даташиты и мануалы, программируя на «Pure C»? Конечно, решать это только вам. Сей опус, в конце концов, был подготовлен по моим личным наблюдениям многочисленных ресурсов, в которых некоторые, как и я, задали уже однажды себе такой вопрос, и тема разрасталась на 10, и более страниц. Тем не менее, сколько бы ни было слов, окончательного вывода нет, и не будет. Кому-то нравится поверхностное программирование, кому-то углублённое. По крайней мере, надеюсь, что мои собственные, хоть, возможно, и субъективные размышления показались интересными тем, кому недостаточно создать код мигания светодиода и не узнать в точности, как это работает на более низком уровне.

    С уважением,
    Rx.
     
    egordorichev и Mitrandir нравится это.
  2. nailxx

    nailxx Официальный Нерд Администратор

    Вот это вы статью отгрохали! Крайне любопытно почитать о мнении в таком развёрнутом виде.

    Позволю себе каплю критики. Мне кажется вы смешиваете понятия IDE (инструмента) и стандартной библиотеки языка программирования. Назовём «продвинутой» разработку в CodeBlocks вместо Arduino IDE и Pure C вместо wiring. Но ведь возможны такие варианты:
    • CodeBlocks + wiring
    • Arduino IDE + Pure C
    Вещи, выходит, вполне независимые и рассматривать их как единое целое некорректно. Пусть даже и то и другое сделано компанией, популяризовавшей Arduino.
    Моё личное мнение таково: Arduino IDE — шляпа, с которой нужно слезать. С автором всецело согласен. Я в своё время для этих целей писал ino. Те, кто работает в терминале и vim'е полюбили эту штуку. Если вы сторонник IDE, то, да: CodeBlocks, Eclipse или Visual Studio.
    Но вот с wiring не соглашусь. Сравните свои же 2 программы: какую понять проще?! Wiring дал возможность гораздо более широкому кругу программистов приобщиться к разработке под микроконтроллеры. Программируя с этой библиотекой можно гораздо лучше сосредоточиться на решаемой проблеме, а не на low-level вопросах. Да, он жирнее, медленнее и не даёт доступа ко всем фишкам МК, но разработка на нём в 100 раз быстрее, чем на Pure C.
    Вообще ничто не мешает в одной программе использовать и то и другое: Wiring — это суперсет Pure C. То, о чём вы говорите, как мне кажется, есть ничто иное как «premature optimization», что как говорил дядя Кармак есть ничто иное как «root of all evils».
    Иными словами: пишите на wiring, а когда вы реально вылезаете за доступную память МК, вам недостаточно производительности или что-то ещё, переписывайте проблемные места и только их на Pure C и гордитесь своей крутостью :)
    Если аргумент не убедителен, задумайтесь: почему все крупные интернет проекты делаются на «тормозных» high-level языках вроде Python, Scala, PHP, Ruby, а не на C++ или ASM? Тот же Google, например, юзает Python и только проблемные места затем переписываются на Java или C++.
     
    Mitrandir, sixaxis и Unixon нравится это.
  3. Unixon

    Unixon Оракул Модератор

    В принципе, ничто не мешает дальше развивать Wiring, либо разработать более совершенный его аналог, позволяющий при той же простоте элементарных операций делать и более сложные вещи, доступные сейчас только через низкоуровневую работу с МК.

    p.s. Считаю постановку повпроса некорретной. Голосовалку в срочном порядке необходимо оборудовать пунктами "И то и другое" и "Ничего из предложенного".
     
  4. Rx

    Rx Нерд

    Благодарю. Приятно, что вы с ней ознакомились.

    Такие варианты возможны, разумеется. К тому же существует специальная сборка, о которой я упомянул чуть выше в самом начале - ArduinoDev CodeBlocks с готовым инструментарием All in One, заточенный именно под Wiring. Никто не спорит, с таким же успехом CodeBlocks справляется и с «Pure C», и со всем остальным. Однако, в универсальной среде, как в этой, тесты по времени компиляции с библиотеками Wiring, неизвестно почему, оказались хуже, чем в стандартной Arduino IDE, поэтому в этом случае я рекомендовал бы дополнение Visual Micro для Visual Studio. Замечательный плагин, да и прошивка с его помощью идёт гораздо быстрее - проверено. Ну, или либо допиливать сборку ArduinoDev CodeBlocks. Наверняка, в скриптах есть какие-то костыли, которые автор смог упустить, к тому же этот проект развивается уж слишком медленно.

    Бесспорно, разного рода готовые дополнения, шаблоны или библиотеки дают возможность сделать код намного быстрее, но эффективнее ли? Немного зная, хочу заметить, «Pure C» появится шанс уже создавать простенькие приложения, вроде «Hello World» или что-то ещё. Ну, а дальше изучение С++ пойдёт, как по маслу. А если знаем только Wiring? Написать определённое что-то кроме программы для Arduino мы не сможем – синтаксис другой, да и не в счёт Processing. Поэтому, в этом случае можно убить сразу двух зайцев, но вот насчёт времени не могу сказать. На изучение «Pure C» его уйдёт намного больше. Касаемо промышленных масштабов, где поджимают сроки, то, наверное, конечно лучше использовать Wiring и, если возникнут какие-либо проблемы, то можно переписать проблемный участок на низком уровне, как вы уже и посоветовали. Вот только:

    Как это сделать, я так и не понял. Спасибо!
     
  5. Unixon

    Unixon Оракул Модератор

    Очень просто: берете ваш пример на "pure C" и вставляете внутрь программы на Wiring в Arduino IDE. :D
     
    robokop, Megakoteyka и nailxx нравится это.
  6. Rx

    Rx Нерд

    Логично. И как это повлияет на то, что неиспользуемые библиотеки в проблемном участке, который будь даже переписан на ассемблере, всё равно скушают место ещё в самом начале?
     
  7. nailxx

    nailxx Официальный Нерд Администратор

    Ценное замечание :) Значит с футпринтом в 2 Кб стоит смириться.
     
  8. sixaxis

    sixaxis Нуб

    очень полезная статья и коменты , спасибо автору и остальным ! у Меня есть один вопрос. Какие конкретно возможности МК (в данном случае awr) Я не смогу реализовать с помощью Arduino ide ? То есть не говоря о долгой компеляции и большого бинарника на выхлопе?
     
  9. roggedhorse

    roggedhorse Гик

    Субъективное мнение:
    Каждая система разработки хороша для своих целей.
    Каждый программист (как и каждый человек) проходит свой путь от blink до очень сложных проектов.
    Большой плюс Arduino IDE - простота. Именно это ее качество позволило (как здесь уже отметили) многим врубиться в суть микроконтроллеров без необходимости совершать подвиг.
    Как только проект вырастает на столько, что время загрузки кода в МК становится ощутимым, приходят идеи выбрать другую оболочку для разработки софта. Что вполне закономерно.
    Я перепробовал несколько инструментов и остановился на двух:
    - все таки Arduino IDE - для целей проверки идеи, когда нужно быстро проверить алгоритм
    - Atmel Studio, обладающую отладчиком, эмулирующим конкретный МК - для всего остального

    Пока меня все устраивает. И, думаю, это главный критерий - устраивает. Поскольку на обучение работе с новой IDE уходит драгоценное время. Если нет неоспоримых преимуществ, то лично я не вижу смысла переходить на другую платформу.

    Что касается Arduino IDE, то иногда (скорее часто) я пишу на чистом С и не использую стандартные setup и loop, а также стандартные библиотеки. Только по той причине, что стандартные либы неэффективно используют ресурс МК. Но эта неэффективность - следствие простоты, ориентированной на массы. Так что ничего дурного в этом нет. Каждый инструмент хорош для своих целей.

    Посему, знакомясь с возможностями новой IDE, я предпочел бы узнать списком о тех фишках и приемах (типа закладок, рефакторинга, автозаполнения объявлений и пр.), которые часто используются программистами при разработке больших или разветвленных проектов и призваны улучшить читаемость кода и сократить время разработки. Тогда проще понять - надо он мне или нет.
     
    Rustem нравится это.
  10. Dmitriy Kunin

    Dmitriy Kunin Гик

    Вставлю пару слов:)
    arduino ide = arduino плата + шилды... (быстро удобно, не гибко)
    Pure C = микроконтроллер + паяльник + проводочки и рассыпуха (медленно, менее удобно, очень гибко)
    Соответственно пользователи делятся на группы: умеет программировать и паять, ему второй вариант.
    Остальные двоичные варианты посчитаете сами :)
     
  11. warman

    warman Гик

    мой вариант - шилды, чаще самодельные + чистый С.
     
  12. DMonin

    DMonin Нерд

    Добрый день.

    Не совсем понятно, что значит медленная компиляция на Arduino IDE? Arduino IDE это обычная обертка над коммандной строкой компилятора GCC. В последней версии GCC 4.3.2 (WinAVR 20081205)

    По-поводу веса программы. Тут не компилятор виноват, а линкощик. Он тащит и линкуют все не достающие библиотеки/хидеры и прочую штукотень, но в реале вы можете пользовать всего 1 функцию из всего, что представлено. Из-за этого размер увеличивается. Если хотите вручную управлять депенденсами, то, добро пожаловать в ад :)

    И напоследок: в разработке п.о. есть такой термин - велоспидирование. Это когда уже решенную задачу решаешь заново своими силами. К примеру, многие новички, которые только-только пришли в сферу разработки начинают писать свои а) субд, б) переписывать 1с, в) переписывать стандартные библиотеки

    Это увеличивает шанс получить ошибку в итоге, и иногда сложно исправляемую ошибку.

    Так, что данный подход, писать на чистом Си - стремоватый. ИМО.
     
    nailxx нравится это.
  13. NR55RU

    NR55RU Гик

    Хотел бы чуть чуть дополнить.
    На мой взгляд в данном случае очень важен контекст в котором новички начинают все это делать.
    Если мы говорим о сфере коммерческой разработки ПО, когда время--ошибки-деньги тут вы правы на 120%, есть готовое проверенное, смысла тратить время на это второй раз нет если не стоит какая-то специфическая задача.

    НО .. если это учебный процесс, то поверьте чем больше вы делаете сами тем лучше, минимум фреймворков, минимум готового кода, минимум надстроек.
    "Программирование есть понимание" (с) Кристин Нюгард
    Отсюда вывод, если вы напишете свою пусть и кривую СУБД вы столкнетесь с теми же проблемами которые решали разработчики действующих СУБД и куда лучше поймете принципы работы СУБД в связи с чем более эффективно сможете использовать готовые СУБД.

    В данном случае по теме я бы сказал так, если вы взяли ардуин просто ради фана, вас не парит познания в программировании и в этой сфере вы двигаться не желаете, можно не парится, фреймворки рулят, быстро удобно, легко, так же если вы опытный программист вы все понимаете и знаете и вам надо быстро замастырить логику то же фрейморк рулит.
    Но если вы учитесь, разбираетесь и желаете ПОНЯТЬ а не просто использовать, все фреймоврки долой, учитесь, разбирайтесь как это работает НА САМОМ деле а не скрывается за фрейворками и надстройками.
    Хотя должен оговориться, базовый старт-ап что бы к примеру понять вообще с чем ардуин едят конечна проще через фреймворк.

    Я лично начинал с фрейморка ардуиновского, но сейчас например меня уже привлекает мысль разобраться как его программировать на чистом Си.

    Таким образом, спор на тему Wiring vs Pure C не приведет ни к чему, пока не будет определено в каком контенте это соперничество осуществляется.
    Ведь не язык определяет требования к программе, а как раз наоборот, требования определяют выбор языка и подхода.
    P.s. Все написанное исключительно мое мнение.
     
    Festour, Megakoteyka и nailxx нравится это.
  14. Lizard_2k1

    Lizard_2k1 Нерд

    Извините за критику, но все таки:
    Не очень понял как notepad.exe может стоять на первом месте, перед Arduino IDE.
    Научите меня в нем (notepad.exe) делать сборку, дебаг и заливку скетчей на плату arduino..
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    В блокнотике пишется код (особенно если это Notepad++), а для сборки и заливки делается командный файл (читайте - скрипт), по которому достаточно ткнуть мышкой или, например, дернуть его на выполнение из Notepad++ горячей клавишей.
    Юникс-вэй, однако :)
     
  16. Megakoteyka

    Megakoteyka Оракул Модератор

    Он и не должен ни к чему приводить, на то он и холивар ;)
     
  17. totuin

    totuin Нерд

    Альтернатива - не писать код вообще. Есть новый проект - flprog.ru.
    Идея подсмотрена на промышленных ПЛК. Рисуется схема электрическая принципиальная, программа компилирует в С для ардуины и заливается в контроллер. Проект потихоньку развивается
     
  18. Unixon

    Unixon Оракул Модератор

    [+] Бесплатная
    [-] Только для Windows
    [-] Исходники закрыты

    :(
     
  19. totuin

    totuin Нерд

    Порт на линукс будет точно, среда позволяет перенести проект на линукс и мак небольшой кровью. Насчет мака сложнее. Проблема техническая. Нет у меня техники с яблочком на корпусе. Дорогая она слишком.
     
  20. Unixon

    Unixon Оракул Модератор

    Открытые исходники и правильно выбранная лицуха => нуждающиеся сами сделают порты под свои системы, какими бы они ни были.

    p.s. дабы не ограничиваться только критикой, хотел бы что-нибудь [хорошее] написать по существу проекта, но форточек пор руками нет, а под wine оно не запустилось.