C ++ против языка Arduino?

81

Каковы преимущества каждого языка при использовании Arduino?

Я думаю, что это хороший общий вопрос, но я добавлю немного о том, почему я спрашиваю, хочет ли кто-нибудь дать мне совет.

У меня есть опыт работы с предварительно обработанными языками, такими как JavaScript, PHP, и я работал с такими языками, как Java и Visual Basic. Другими словами, я знаю методы программирования и классическую и прототипную объектную ориентацию, но ничего не имею о непосредственном общении с оборудованием.

Я делаю октокоптер и думаю, что объектно-ориентированный подход будет самым легким. (У программного обеспечения будет очень много возможностей ...) Однако я никогда не писал на C ++.

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

Друг ким
источник
16
Избегайте Arduino IDE, так как он не заслуживает своего названия IDE, это даже очень плохой редактор: он может быть хорош для начинающих и простых набросков, но нужно быстро перейти к чему-то лучшему.
jfpoilpret
4
Это довольно краткое описание того, что имеется в виду (и что на самом деле скрыто под «языком программирования Arduino»).
АдъюнктПрофессорFalcon
10
C++ vs. The Arduino Language?- "Arduino Language" - это C ++. Существует небольшая предварительная обработка, чтобы избавить вас от создания прототипов функций, но наиболее определенно это C ++.
Ник Гэммон
2
Там нет такого понятия, как язык Arduino. Это просто библиотека.
Overdrivr
2
Не столь связанный с вопросом, как с комментариями: студия Atmel бесплатна, и ИМХО, она лучше визуальной студии для программирования Arduino. Также поддерживает плагин Visual Micro, хотя он совсем не нужен для программирования и отладки arduinos.
cyberponk

Ответы:

55

Мой личный опыт работы профессором (программирование, мехатроника) заключается в том, что если у вас есть опыт программирования и вы знакомы с такими понятиями, как ООП, лучше перейти на C / C ++. Язык arduino действительно хорош для начинающих, но имеет некоторые ограничения (например, вы должны иметь все свои файлы в одной папке). И это в основном упрощение C / C ++ (вы можете практически скопировать и вставить код arduino в файл C / C ++, и это будет работать). Также имеет смысл, что вы можете пойти и использовать полностью известную IDE как eclipse:

http://playground.arduino.cc/Code/Eclipse

Изначально требуется немного больше настройки и настройки вашей среды разработки, но имхо это того стоит для программистов с опытом работы на любом другом языке.

В любом случае, вам не помешает в течение нескольких дней использовать язык arduino и IDE arduino, чтобы ознакомиться с оборудованием arduino, а затем перейти на C / C ++ с Eclipse для реальной разработки вашего проекта.

drodri
источник
Спасибо за ваши мысли. Я буду использовать Arduino IDE, чтобы научиться управлять всеми различными аппаратными компонентами, такими как датчики, ЖК-экраны и т. Д. Затем я перейду на C ++, чтобы создать программное обеспечение для октокоптера. Вы знаете хорошую и короткую книгу для людей, которые знают другие языки? «Проблема» со многими книгами, которые я обнаружил, заключается в том, что в них так много всего, что мне не нужно, потому что я работаю на небольшом микроконтроллере Atmel, а не на компьютере с пользовательским интерфейсом.
Друг Ким
1
Есть хорошая книга Жюльена Байле "Программирование на C для Arduino", которая полезна. Это C, а не язык C ++, но он должен помочь вам понять основы.
fenix688
Это хороший запрос: короткая и хорошая книга с основами C ++ для программистов других языков. Извините, я не могу дать никаких рекомендаций, я не знаю ни одного хорошего. На самом деле, я написал книгу, с практической направленностью (разработкой видеоигры) для моих учеников, но она только на испанском языке. Для хорошей и практичной книги по C ++ я бы порекомендовал Deitel & Deitel. Как программировать на C ++, вы можете пропустить много продвинутых глав.
Дродри
1
C ++ поддерживает функции OO, язык C - нет.
Крис О
1
@FriendofKim Не совсем то, что я имел в виду (хотя технически вы могли бы, Due достаточно быстр, чтобы поддерживать программное решение для немегабитной последовательной связи, и он имеет всего 5 U (S) ARTS, в то время как библиотеки Arduino обеспечивают только 4 их, но iirc Due due Board все равно не предоставляет контакты для одного из USART); библиотеки Arduino настраивают USART на использование асинхронного режима, но мне нужно было синхронное соединение со скоростью до 6 Мбит / с (и мне пришлось использовать режим SPI, так как вход должен был рассматриваться как необработанный битовый поток, поэтому нет стоп-битов и т. д.), что также включало изменение конфигурации контроллера PIO по умолчанию.
JAB
48

Теоретически ...
Ардуино как такового не существует. Это действительно просто C ++ с некоторыми предметно-ориентированными библиотеками. Они добавляют различные функции, такие как функции, которые вы можете вызывать для управления оборудованием. Если бы у вас не было этих функций, вам нужно было бы напрямую поиграть со специальными регистрами, чтобы все контролировать. Вот как обычно делается встроенное программирование. Это быстро, но это может быть довольно трудно учиться и понимать.

В дополнение к функциям библиотеки добавляют альтернативные имена для некоторых типов. Например, booleanи byteне в стандарте C ++. Однако они прямо эквивалентны boolи unsigned char.

Все это означает, что вы, вероятно, можете без проблем перенести общий код C ++ непосредственно в Arduino. Однако возвращение в другую сторону может потребовать незначительного редактирования.

На практике ...
Сказав все это, программирование для Arduino не совсем то же самое, что и общее программирование на C ++. Однако многие различия являются общими для всех встроенных программ (например, ограниченная память и вычислительная мощность).

Стоит также отметить, что если вы используете официальную Arduino IDE, то существуют разные раздражающие особенности и ограничения в настройке кода. Есть обходные пути во всех случаях (насколько я знаю), но они иногда довольно разочаровывают.

Для полной гибкости используйте стороннюю IDE (например, Eclipse) с плагином для поддержки Arduino. Это должно дать вам все преимущества C ++, наряду с библиотеками Arduino.

Питер Блумфилд
источник
25

Каковы преимущества C ++ по сравнению с языком Arduino при использовании Arduino? У меня есть опыт работы с предварительно обработанными языками, такими как JavaScript, PHP, и я работал с такими языками, как Java и Visual Basic.

Во-первых, компилятор / IDE Arduino принимает C и C ++ как есть. На самом деле многие библиотеки написаны на C ++. Большая часть базовой системы не является объектно-ориентированной, но это может быть.

Таким образом, «язык Arduino» - это C ++ или C.

C ++ не является сборщиком мусора. Он управляет переменными в области видимости - если вы напишите:

int led = 13;

void blinkTimes(int value)
{
   int i;

   for(i=0;i<value;i++)
   {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
   }
}

Тогда вы обнаружите это ledи iне будете расти или протекать, независимо от того, сколько раз вы звоните blinkTimes.

Если бы iэто был класс, он также был бы удален после завершения функции. Поэтому, если вы не используете newили не используете аналогичные функции выделения памяти для создания новых объектов, вам не придется беспокоиться об утечках.

Вы все еще можете запустить из памяти, если вы создаете огромные классы и используйте их много глубоко вложенные функции, но в целом вы не собираетесь работать в неприятность , пока вы не начнете дело с newи freeфункцией.

Если вы используете new, то вам придется позвонить deleteв подходящее время. C ++, и, как расширение Arduino, не имеет автоматической сборки мусора, вы должны явно управлять своей собственной памятью.

Адам Дэвис
источник
1
Хорошо, если созданные объекты (с новыми) не будут собирать мусор, мне тоже придется это изучить. Я полагаю, что любая книга на C ++ будет освещать это. Спасибо за хороший ответ!
Друг Ким
14

Язык Arduino - C ++, но он сильно отличается от большинства разновидностей C ++. В язык Arduino встроено много абстракций, особенно в аппаратных интерфейсах, что делает его очень простым в использовании. Если у вас есть опыт работы с Java, C и C ++ должны быть очень похожими.

Основные различия между Arduino и C ++ заключаются в хранении памяти. Обычно современный компьютер имеет более 2 ГБ оперативной памяти, а Arduino Uno - 2 КБ (в 1 миллион раз меньше). Arduino также использует 8-битные инструкции вместо 32-битных, которые использует компьютер. Это в основном повлияет на объем информации, которую вы можете хранить в переменной.

Если вы новичок в мире Arduino, вам следует поискать учебник, так как есть много хороших.

Доктор
источник
Вы упоминаете память. У меня есть Due, который получил 96 КБ оперативной памяти. Но последнее, что я хочу, - это чтобы вертолет разбился из-за утечки памяти (на нем установлена ​​очень дорогая камера).
Друг Ким
Обрабатывается ли память в C ++ автоматически (как сборщик мусора в Java), если не указано иное?
друг Кима
2
Стандарт C ++ не дает никаких гарантий относительно размеров памяти - c ++ уже работает на встроенном оборудовании без изменений.
Майкл Торп
2
Вы описываете различия между аппаратными платформами, но не C ++.
Cybergibbons
5
@FriendofKim В C ++ есть два разных способа создания экземпляров переменных / объектов. Если вы создадите их экземпляры локально (например int blah = 5;), то они будут автоматически уничтожены, когда они выйдут из области видимости (то есть в конце цикла или функции). Однако, если вы создаете их экземпляр в куче (например int *blah = new int(5);), то вам нужно освободить их самостоятельно. Хотя обычно нецелесообразно использовать кучу данных во встроенном программировании.
Питер Блумфилд,
14

--- Обновление 170412
Я написал свой оригинальный ответ три года назад с точки зрения существования отдельного "Arduino C ++". Язык, используемый в IDE, является стандартным C ++, потому что он реализован компилятором GNU C ++. Появляются «очевидные» различия, потому что IDE выполнит некоторую предварительную обработку, чтобы помочь новичкам в изучении языка избежать пары «уловок», заполнив несколько #include, f / ex. Но вы можете - и я делаю - написать правильный C ++ и получить именно то, что вы ожидаете получить.
--- конец обновления

Ограничьте использование возможностей языка C ++ теми, чью реализацию вы полностью понимаете. Есть некоторые функции, которые компилируются в более ресурсоемкий код, чем очевидно из чтения исходного кода. Опционально сгенерированный листинг .lss (объединенный источник и сборка) может дать вам хорошее представление о том, что делал компилятор C ++, когда вы не искали.

К вашему вопросу о памяти: C ++ не сборщик мусора. Основанные на стеке языки, такие как C и C ++, выделяют временное хранилище в стеке для автоматических переменных при входе в функцию, которое затем освобождается при возврате функции, но это не настоящая сборка мусора. Объекты, созданные в куче или глобальной памяти, живут до тех пор, пока вы их явно не удалите. Убедитесь, что вы знаете, где, когда и как долго будут создаваться различные типы объектов. Вы действительно не хотите, чтобы ваши объекты кода- newи- deleteволи были волей-неволей. Они будут встроены в кучную память, фрагментируя ее и заставляя ее расти в стеке. Вот когда ваш код - и ваш хороший коптер - потерпит крах.

C делает меньше для вас, поэтому он может сделать меньше для вас. Это не плохой выбор. C с несколькими функциями C ++ может быть еще лучшим выбором, если вы выбираете дополнительные функции разумно. C ++, если это ваш выбор:

[Оригинальный ответ] - C ++ является стандартизированным языком. Он широко развернут во многих средах, включая встроенные системы, и, следовательно, более тщательно протестирован, чем язык "очень похож на C ++", который называется "Arduino". Это особенно важно для критически важных / безопасных приложений, таких как вы планируете. Разбился код означает , что разбившийся «вертолет и даже если это не повредит кому - то, он будет разбить дорогую машину.

  • Стандарт C ++ является переносимым. Нужно обновить свой процессор? Все, кроме кремниевого кода, будет портировать на новый. Нужно изменить свой набор инструментов, систему разработки, хост-ОС? C ++ будет поддерживаться везде. Хотя Arduino IDE будет работать везде, где поддерживается Java, это единственный инструмент, который использует Arduino C ++, и это очень ограниченный инструмент. Если вы хотите использовать Eclipse, инструменты AVR, ходить босиком по командной строке, разрабатывать в Emacs или в любой другой среде, которую вы предпочитаете, будет поддерживаться стандарт C ++.

  • Arduino IDE работает за вашей спиной - в частности, он включает .h файлы, когда считает, что они вам нужны. Даже если это правильно, вы действительно хотите написать или, по крайней мере, увидеть и понять все, что увидит компилятор. Языки программирования не предназначены для компьютеров (компьютеры едят кусочки на завтрак); они созданы для людей, особенно для тех, кто следит за вами в проекте, наиболее важными из которых могут быть ... вы !, когда через 6 месяцев после написания модуля вы должны вернуться, чтобы улучшить его, или еще скорее всего, почините. Вы действительно хотите видеть все, что видит компилятор.

JRobert
источник
2
Это действительно хороший ответ. Кажется очевидным, что вам нравится C ++, и мне это тоже нравится! ... А если серьезно, я сразу перейду к C ++, как только пойму, как работает "связь" с различными датчиками и т. Д.
Друг Кима
Вы знаете какие-нибудь хорошие книги на эту тему? (Подходит для меня, который годами занимается программированием на других языках и нуждается только во «встроенной части» C ++.)
Друг Кима
Как вы думаете, Accelerated C ++ - хорошая книга для этого?
Друг Ким
2
Хотелось бы помочь вам с «правильной» книгой, но я пришел на C ++ с большим количеством C позади меня, а Kernighan & Ritchie's C Programming Language по-прежнему является моей популярной книгой (плохой каламбур) для всего, что не является явно C ++ и Справочное руководство по аннотированному C ++ для C ++ Эллиса и Страуструпа . Но для записи на аппаратное обеспечение вам лучше взглянуть на некоторые библиотеки устройств, предоставленные пользователями Arduino.cc . Начните с настройки портов ввода / вывода с помощью функций pinMode (), digitalWrite () и digitalRead (), затем их аналоговых аналогов ввода / вывода и, в конце концов, ...
JRobert
1
... планировать запись непосредственно в регистры ввода / вывода для улучшения скорости и объема памяти. Такие программы, как blinky.cpp и hello.cpp, являются хорошими местами, чтобы начать возиться с оборудованием. Добавьте простой мультиметр и несколько светодиодов с правильными токоограничивающими резисторами, постоянно припаянными к одной ножке, и вы сможете увидеть реальные, хотя и простые, результаты ваших усилий. После этого прочитайте технические паспорта для любого интересующего вас оборудования, чтобы узнать, какие сигналы вы можете прочитать / записать на них, чтобы заставить их играть. Датчики температуры просты в использовании, и не всем ли нужен холодильник-регистратор? Веселиться!
JRobert
10

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

  • Само управление памятью использует ценную программу и объем оперативной памяти
  • Векторы ISR устанавливаются при компиляции. Для экземпляра класса трудно (невозможно?) Требовать ISR во время выполнения
  • Как правило, во время компиляции вы будете знать, какие экземпляры классов вам нужны - например, 3 кнопки-отладчика, драйвер дисплея и двухстрочный драйвер дисплея
  • Управление памятью вводит неизвестные задержки при использовании нового или удаления.

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

kiwiron
источник
Будучи совершенно новым для C ++, у меня возник вопрос по поводу ЗППП. Это плохая идея, память целесообразно использовать? Если нет, то как его можно добавить (Eclipse)? Я установил компилятор AVR, и он работает хорошо.
Друг Ким
1
Все, что вы говорите, верно, но я не понимаю, как это ответ на вопрос ОП. newи deleteдоступны в Arduino IDE тоже.
jfpoilpret
Это не ответ, но очень полезная информация, которую я действительно ценю.
Друг Ким
8

Как упоминалось в нескольких ответах, если вы программируете встроенную систему в целом, вам следует избегать новой, если вы не управляете своей собственной кучей памяти и не знаете, какими будут жизненные циклы вашего объекта. Статическое распределение или переменные стека намного безопаснее. Тем не менее, один общий прием для управления такими вещами, как буферы переменной длины, выделяемые на время выполнения функции, - это иметь автоматическую переменную (в стеке), которая является объектом, вызывающим new, в своем конструкторе, а затем помещать удаление в деструктор. поэтому, когда объект выходит из области видимости, буфер освобождается обратно в кучу. Опять же, это обычно ограниченное использование в маленьких микро, но это хорошая модель, чтобы помнить.

bd2357
источник
6

В дополнение к комментариям выше, я хотел бы еще раз подчеркнуть проблемы с оперативной памятью, имеющейся у вас на платах Arduino, особенно с Uno (и другими, которые используют тот же микроконтроллер). Недавно я написал простую игру Space Invaders, работающую на светодиодной матрице 32x32, и неоднократно сталкивался с проблемами, вызванными нехваткой памяти.

Uno имеет только 2048 байт оперативной памяти. Библиотека для моей матрицы заняла 3/4 от этого, и у меня осталось около 400 байт для игры. Поскольку я собираюсь «обновить» проект в какой-то момент, чтобы запустить несколько игр с одной и той же программной базой на более мощном Due, я разработал код с принципами ОО и большим количеством наследования классов. (Класс игры был унаследован с виртуальными вызовами обновления и рисования, все игровые объекты были унаследованы).

Я почти исчерпал память, просто добавив захватчиков. Я попытался сэкономить память, выставив битовые переменные-члены, но снова выбежал при добавлении объектов-щитов. После еще большего количества соскоба я выбежал, добавляя бомбы / пули. На этом этапе я просмотрел код и удалил все «виртуальные» теги (все мои прототипы класса созданы на основе фрагмента Visual Assist, а деструкторы автоматически становятся виртуальными). Это уменьшило вдвое мое использование памяти, освобождая достаточно, чтобы иметь возможность завершить код.

Короче говоря, конечным результатом является код C ++, который на самом деле не использует никаких функций C ++. Вы могли бы просто придерживаться C и быть очень осведомленным об использовании вашей памяти. Вы не получите никакой помощи, если вы превысите 2 КБ - особенно если вы используете какое-либо динамическое распределение, код просто перестает работать, и вам остается какое-то время ломать голову, пока вы не подумаете о возможности переполнения памяти.

PS - Битовые переменные поля плохие. Очень плохо. Помимо добавления накладных расходов на обработку, я потерял счет того, сколько раз я добавлял в игру новое состояние, но код не запускался, и я не мог понять, почему. Моя переменная состояния не была достаточно широкой, чтобы содержать новое значение состояния, поэтому я получил неожиданное состояние.

Мик Уэйтс
источник
4

Язык Arduino - это C ++ (хотя обычно он реализуется в стиле, более похожем на «C с классами», который на самом деле довольно распространен в мире микроконтроллеров встроенных систем). Конец истории. Хватит думать, что это уже другой язык! Он использует компилятор g ++.

Доказательство:

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

Вот некоторые дополнительные идеи:

Мои собственные слова:

Код Arduino - C ++. Основные функции Arduino - это просто набор классов и библиотек C ++, которые вы можете использовать. Он построен и скомпилирован с использованием компилятора GNU gcc / g ++ . Ваши функции setup () и loop () просто помещаются в обязательную функцию main () ( здесь на самом деле - обратите внимание, что файл «main.cpp», который является исходным файлом C ++) автоматически для вас, и есть некоторые дополнительные предварительная обработка выполнена для того, чтобы убедиться, что это действительная программа на C ++ (например, сканирование для всех прототипов функций [aka: декларации] для вас, чтобы вы могли использовать функцию, даже если ее прототип появится позже в вашем файле .ino). Однако, большая часть Arduino написана в «стиле C», и поэтому требует, чтобы # extern "C" {}вокруг нее были скобки, чтобы C ++ не могФункция «name-mangling» (также известная как «декорирование / декорирование имени» ) вызывает функции C, реализованные AVR-libc , которая является реализацией C для ATmega328 и других микроконтроллеров архитектуры AVR .

Слова Ардуино:

« Могу ли я запрограммировать плату Arduino на C?
Фактически, вы уже это делаете; язык Arduino - это просто набор функций C / C ++, которые можно вызывать из вашего кода. Ваш эскиз претерпевает незначительные изменения (например, автоматическая генерация прототипов функций) и затем передается непосредственно компилятору C / C ++ (avr-g ++). Все стандартные конструкции C и C ++, поддерживаемые avr-g ++, должны работать в Arduino. Для получения дополнительной информации см. страницу процесса сборки Arduino . "

Источник: https://www.arduino.cc/en/Main/FAQ#toc13.

Когда использовать библиотеку Arduino против чистого C или C ++?

Итак, используйте язык Arduino, где он упрощает вещи, и пишите свои собственные функции, где вам нужно больше специализации. Я рекомендую быстро выйти из среды IDE для написания кода - просто используйте его для компиляции. Установите настройки IDE, чтобы использовать «Внешний редактор». Затем используйте профессиональный редактор исходного кода / IDE, такой как Sublime Text 3 , Atom , Visual Studio Code или Eclipse CDT, чтобы написать свой код. Затем вы можете нажать обратно в Arduino IDE, чтобы скомпилировать и загрузить. Если вы работаете с Eclipse, в Eclipse есть способы сделать это (см. Другие ответы здесь и статью Eclipse для игровой площадки Arduino ), поэтому подумайте и об использовании этих методов.

Габриэль Стейплс
источник