Каковы преимущества каждого языка при использовании Arduino?
Я думаю, что это хороший общий вопрос, но я добавлю немного о том, почему я спрашиваю, хочет ли кто-нибудь дать мне совет.
У меня есть опыт работы с предварительно обработанными языками, такими как JavaScript, PHP, и я работал с такими языками, как Java и Visual Basic. Другими словами, я знаю методы программирования и классическую и прототипную объектную ориентацию, но ничего не имею о непосредственном общении с оборудованием.
Я делаю октокоптер и думаю, что объектно-ориентированный подход будет самым легким. (У программного обеспечения будет очень много возможностей ...) Однако я никогда не писал на C ++.
Поскольку это сайт вопросов и ответов, который должен помогать другим, очень важен только общий вопрос, представленный в начале, но я был бы признателен за любые комментарии по моей ситуации.
источник
C++ vs. The Arduino Language?
- "Arduino Language" - это C ++. Существует небольшая предварительная обработка, чтобы избавить вас от создания прототипов функций, но наиболее определенно это C ++.Ответы:
Мой личный опыт работы профессором (программирование, мехатроника) заключается в том, что если у вас есть опыт программирования и вы знакомы с такими понятиями, как ООП, лучше перейти на C / C ++. Язык arduino действительно хорош для начинающих, но имеет некоторые ограничения (например, вы должны иметь все свои файлы в одной папке). И это в основном упрощение C / C ++ (вы можете практически скопировать и вставить код arduino в файл C / C ++, и это будет работать). Также имеет смысл, что вы можете пойти и использовать полностью известную IDE как eclipse:
http://playground.arduino.cc/Code/Eclipse
Изначально требуется немного больше настройки и настройки вашей среды разработки, но имхо это того стоит для программистов с опытом работы на любом другом языке.
В любом случае, вам не помешает в течение нескольких дней использовать язык arduino и IDE arduino, чтобы ознакомиться с оборудованием arduino, а затем перейти на C / C ++ с Eclipse для реальной разработки вашего проекта.
источник
Теоретически ...
Ардуино как такового не существует. Это действительно просто C ++ с некоторыми предметно-ориентированными библиотеками. Они добавляют различные функции, такие как функции, которые вы можете вызывать для управления оборудованием. Если бы у вас не было этих функций, вам нужно было бы напрямую поиграть со специальными регистрами, чтобы все контролировать. Вот как обычно делается встроенное программирование. Это быстро, но это может быть довольно трудно учиться и понимать.
В дополнение к функциям библиотеки добавляют альтернативные имена для некоторых типов. Например,
boolean
иbyte
не в стандарте C ++. Однако они прямо эквивалентныbool
иunsigned char
.Все это означает, что вы, вероятно, можете без проблем перенести общий код C ++ непосредственно в Arduino. Однако возвращение в другую сторону может потребовать незначительного редактирования.
На практике ...
Сказав все это, программирование для Arduino не совсем то же самое, что и общее программирование на C ++. Однако многие различия являются общими для всех встроенных программ (например, ограниченная память и вычислительная мощность).
Стоит также отметить, что если вы используете официальную Arduino IDE, то существуют разные раздражающие особенности и ограничения в настройке кода. Есть обходные пути во всех случаях (насколько я знаю), но они иногда довольно разочаровывают.
Для полной гибкости используйте стороннюю IDE (например, Eclipse) с плагином для поддержки Arduino. Это должно дать вам все преимущества C ++, наряду с библиотеками Arduino.
источник
Во-первых, компилятор / IDE Arduino принимает C и C ++ как есть. На самом деле многие библиотеки написаны на C ++. Большая часть базовой системы не является объектно-ориентированной, но это может быть.
Таким образом, «язык Arduino» - это C ++ или C.
C ++ не является сборщиком мусора. Он управляет переменными в области видимости - если вы напишите:
Тогда вы обнаружите это
led
иi
не будете расти или протекать, независимо от того, сколько раз вы звонитеblinkTimes
.Если бы
i
это был класс, он также был бы удален после завершения функции. Поэтому, если вы не используетеnew
или не используете аналогичные функции выделения памяти для создания новых объектов, вам не придется беспокоиться об утечках.Вы все еще можете запустить из памяти, если вы создаете огромные классы и используйте их много глубоко вложенные функции, но в целом вы не собираетесь работать в неприятность , пока вы не начнете дело с
new
иfree
функцией.Если вы используете
new
, то вам придется позвонитьdelete
в подходящее время. C ++, и, как расширение Arduino, не имеет автоматической сборки мусора, вы должны явно управлять своей собственной памятью.источник
Язык Arduino - C ++, но он сильно отличается от большинства разновидностей C ++. В язык Arduino встроено много абстракций, особенно в аппаратных интерфейсах, что делает его очень простым в использовании. Если у вас есть опыт работы с Java, C и C ++ должны быть очень похожими.
Основные различия между Arduino и C ++ заключаются в хранении памяти. Обычно современный компьютер имеет более 2 ГБ оперативной памяти, а Arduino Uno - 2 КБ (в 1 миллион раз меньше). Arduino также использует 8-битные инструкции вместо 32-битных, которые использует компьютер. Это в основном повлияет на объем информации, которую вы можете хранить в переменной.
Если вы новичок в мире Arduino, вам следует поискать учебник, так как есть много хороших.
источник
int blah = 5;
), то они будут автоматически уничтожены, когда они выйдут из области видимости (то есть в конце цикла или функции). Однако, если вы создаете их экземпляр в куче (напримерint *blah = new int(5);
), то вам нужно освободить их самостоятельно. Хотя обычно нецелесообразно использовать кучу данных во встроенном программировании.--- Обновление 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 месяцев после написания модуля вы должны вернуться, чтобы улучшить его, или еще скорее всего, почините. Вы действительно хотите видеть все, что видит компилятор.
источник
По моему опыту, лучше избегать новых и удалять при работе на машинах с ограниченной памятью.
Могут быть случаи, когда оправдано использование динамического создания и уничтожения экземпляра, но я подозреваю, что они редки.
источник
new
иdelete
доступны в Arduino IDE тоже.Как упоминалось в нескольких ответах, если вы программируете встроенную систему в целом, вам следует избегать новой, если вы не управляете своей собственной кучей памяти и не знаете, какими будут жизненные циклы вашего объекта. Статическое распределение или переменные стека намного безопаснее. Тем не менее, один общий прием для управления такими вещами, как буферы переменной длины, выделяемые на время выполнения функции, - это иметь автоматическую переменную (в стеке), которая является объектом, вызывающим new, в своем конструкторе, а затем помещать удаление в деструктор. поэтому, когда объект выходит из области видимости, буфер освобождается обратно в кучу. Опять же, это обычно ограниченное использование в маленьких микро, но это хорошая модель, чтобы помнить.
источник
В дополнение к комментариям выше, я хотел бы еще раз подчеркнуть проблемы с оперативной памятью, имеющейся у вас на платах Arduino, особенно с Uno (и другими, которые используют тот же микроконтроллер). Недавно я написал простую игру Space Invaders, работающую на светодиодной матрице 32x32, и неоднократно сталкивался с проблемами, вызванными нехваткой памяти.
Uno имеет только 2048 байт оперативной памяти. Библиотека для моей матрицы заняла 3/4 от этого, и у меня осталось около 400 байт для игры. Поскольку я собираюсь «обновить» проект в какой-то момент, чтобы запустить несколько игр с одной и той же программной базой на более мощном Due, я разработал код с принципами ОО и большим количеством наследования классов. (Класс игры был унаследован с виртуальными вызовами обновления и рисования, все игровые объекты были унаследованы).
Я почти исчерпал память, просто добавив захватчиков. Я попытался сэкономить память, выставив битовые переменные-члены, но снова выбежал при добавлении объектов-щитов. После еще большего количества соскоба я выбежал, добавляя бомбы / пули. На этом этапе я просмотрел код и удалил все «виртуальные» теги (все мои прототипы класса созданы на основе фрагмента Visual Assist, а деструкторы автоматически становятся виртуальными). Это уменьшило вдвое мое использование памяти, освобождая достаточно, чтобы иметь возможность завершить код.
Короче говоря, конечным результатом является код C ++, который на самом деле не использует никаких функций C ++. Вы могли бы просто придерживаться C и быть очень осведомленным об использовании вашей памяти. Вы не получите никакой помощи, если вы превысите 2 КБ - особенно если вы используете какое-либо динамическое распределение, код просто перестает работать, и вам остается какое-то время ломать голову, пока вы не подумаете о возможности переполнения памяти.
PS - Битовые переменные поля плохие. Очень плохо. Помимо добавления накладных расходов на обработку, я потерял счет того, сколько раз я добавлял в игру новое состояние, но код не запускался, и я не мог понять, почему. Моя переменная состояния не была достаточно широкой, чтобы содержать новое значение состояния, поэтому я получил неожиданное состояние.
источник
Язык 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 .Слова Ардуино:
Источник: 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 ), поэтому подумайте и об использовании этих методов.
источник