C ++ против Arduino Language?

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

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

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

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

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

63 голоса | спросил Friend of Kim 19 MarpmWed, 19 Mar 2014 18:34:30 +04002014-03-19T18:34:30+04:0006 2014, 18:34:30

9 ответов


44

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

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

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

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

ответил drodri 19 MarpmWed, 19 Mar 2014 18:51:57 +04002014-03-19T18:51:57+04:0006 2014, 18:51:57
36

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

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

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

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

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

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

ответил Peter Bloomfield 19 MarpmWed, 19 Mar 2014 18:59:26 +04002014-03-19T18:59:26+04:0006 2014, 18:59:26
20
  

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

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

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

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

int led = 13;

void blinkTimes (значение int)
{
   int i;

   для (я = 0; я & л; значение; я ++)
   {
      digitalWrite (светодиод, HIGH);
      Задержка (1000);
      digitalWrite (led, LOW);
      Задержка (1000);
   }
}

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

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

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

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

ответил Adam Davis 19 MarpmWed, 19 Mar 2014 21:27:00 +04002014-03-19T21:27:00+04:0009 2014, 21:27:00
12

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

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

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

ответил TheDoctor 19 MarpmWed, 19 Mar 2014 18:52:47 +04002014-03-19T18:52:47+04:0006 2014, 18:52:47
11

C ++, если это ваши два варианта:

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

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

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

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

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

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

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

ответил JRobert 19 MarpmWed, 19 Mar 2014 21:09:02 +04002014-03-19T21:09:02+04:0009 2014, 21:09:02
8

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

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

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

ответил kiwiron 31 MarpmMon, 31 Mar 2014 13:25:32 +04002014-03-31T13:25:32+04:0001 2014, 13:25:32
7

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

ответил bd2357 30 PMpThu, 30 Apr 2015 19:20:04 +030020Thursday 2015, 19:20:04
5

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

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

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

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

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

ответил Mick Waites 1 Mayam15 2015, 09:42:25
3

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

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

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

Вот несколько дополнительных возможностей:

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

Код Arduino есть C ++. Arduino основные функции - это просто набор классов и библиотек C ++, которые вы можете использовать. Он построен и скомпилирован с помощью компилятора GNU gcc /g ++ . Функции setup () и loop () просто помещаются в обязательную функцию main () ( прямо здесь - не указывать файл« main.cpp », который является исходным файлом C ++) автоматически для вас, и есть некоторая дополнительная предварительная обработка, сделанная для того, чтобы сделать конечно, это действительная программа на C ++ (например, для всех прототипов функций [aka: declarations] для вас, чтобы вы могли использовать функцию, даже если ее прототип появится позже в вашем .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 , или Eclipse CDT , чтобы написать свой код. Затем вы можете вернуться к среде разработки Arduino для компиляции и загрузки. Если вы идете с Eclipse, есть способы сделать это в Eclipse (см. Другие ответы здесь и посмотрите Arduino playground Eclipse article здесь), поэтому подумайте об использовании этих методов.

ответил Gabriel Staples 17 MaramSat, 17 Mar 2018 02:21:30 +03002018-03-17T02:21:30+03:0002 2018, 02:21:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132