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


81

Які переваги кожної мови при використанні Arduino?

Я думаю, що це гарне загальне питання, але я додам трохи про те, чому я питаю, чи хтось хоче дати мені пораду.

Я маю досвід роботи з попередньо обробленими мовами, такими як JavaScript, PHP, і я спіткався з такими мовами, як Java та Visual Basic. Іншими словами, я знаю методики програмування і класичної, і прототипової орієнтації на об'єкти, але нічого про спілкування безпосередньо з апаратними засобами.

Я роблю осьокоптер і думаю, що об'єктно-орієнтований підхід буде найпростішим. (У програмного забезпечення буде дуже багато функцій ...) Однак я ніколи не писав на C ++.

Оскільки це веб-сайт із питань і запитів, який повинен допомогти іншим, лише загальне питання, подане на початку, має велике значення, але я вдячний за будь-які коментарі щодо моєї ситуації.


16
Уникайте Arduino IDE, оскільки він не заслуговує свого імені IDE, це навіть дуже поганий редактор: це може бути добре для початківців і простих ескізів, але потрібно швидко перейти до чогось кращого.
jfpoilpret

4
Це досить стислий розбір того, що мається на увазі під поняттям «мова програмування Arduino» (а що насправді під кришкою).
AdjunctProfessorFalcon

10
C++ vs. The Arduino Language?- "Мова Ардуїно" - це C ++. Існує трохи попередньої обробки, щоб заощадити на роботі прототипів функцій, але, безумовно, це C ++.
Нік Гаммон

2
Не існує такого поняття, як ардуїнська мова. Це просто бібліотека.
Overdrivr

2
Не так пов'язано з питанням, як із коментарями: студія Atmel безкоштовна, а IMHO - це краще, ніж візуальна студія для програмування ардуїно. Також підтримує плагін Visual Micro, хоча це зовсім не потрібно для програмування та налагодження ардуїно.
кіберпонк

Відповіді:


55

Мій особистий досвід професора (програмування, мехатроніка) полягає в тому, що якщо у вас є досвід попереднього програмування і ви обізнані з поняттями як OOP, краще перейти на C / C ++. Мова ардуїно справді чудово підходить для початківців, але має деякі обмеження (наприклад, ви повинні мати усі свої файли в одній папці). І це в основному спрощення C / C ++ (ви можете практично скопіювати та вставити ардуїно код у файл C / C ++, і він спрацює). Також має сенс, що ви можете піти і використовувати повністю відомий IDE як затемнення:

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

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

У будь-якому випадку, це не зашкодить вам почати використовувати мову ардуїно та ардуїно IDE протягом декількох днів, щоб ознайомитись з обладнанням ардуїно, а потім перейти до C / C ++ з Eclipse для дійсного розвитку вашого проекту.


Дякую за думки. Я скористаюсь Arduino IDE, щоб навчитися керувати всіма частинами обладнання, такими як датчики та РК-екрани тощо. Потім я перейду до C ++, щоб створити програмне забезпечення для октокоптера. Чи знаєте ви добру і коротку книгу для людей, які знають інші мови? "Проблема" багатьох книг, які я знайшла, полягає в тому, що вони включають стільки, що мені не потрібно, тому що я перебуваю на невеликому мікроконтролері Atmel, а не на комп'ютері з інтерфейсом.
Друг Кіма

1
Є корисна книга "Програмування на C для Arduino" Жульєна Бейла, яка корисна. Це мова не C ++, але повинна допомогти вам зрозуміти основу.
fenix688

Це хороший запит: коротка та добра книга з основами C ++ для програмістів інших мов. Вибачте, я не можу дати жодних рекомендацій, я не знаю жодної хорошої. Насправді я написав книгу з практичним фокусом (розробити відеоігра) для своїх учнів, але це лише іспанською мовою. Для гарної та практичної книги на C ++ я рекомендував би Deitel & Deitel. Як програмувати C ++, ви можете пропустити багато розширених розділів.
drodri

1
C ++ підтримує функції OO, мова C - ні.
Кріс О

1
@FriendofKim Не зовсім те, що я мав на увазі (хоча технічно це можна зробити, Due достатньо швидкий, щоб підтримати програмне рішення для немегабітного послідовного зв’язку, і він має загалом 5 U (S) АРТС, тоді як бібліотеки Arduino надають лише 4 з їх, окрім iirc, комісія Due не надає шпильки для одного з USART); бібліотеки Arduino налаштовують USARTs для використання асинхронного режиму, але мені потрібен синхронний з частотою до 6 Мбіт / с (і мені довелося використовувати режим SPI, оскільки вхід повинен був оброблятися як необроблений бітовий потік, щоб не було стоп-бітів / тощо), які також брали участь зміни конфігурації контролера PIO за замовчуванням.
JAB

48

Теоретично ...
Не існує насправді ардуїнської мови як такої. Це дійсно просто C ++ з деякими доменними бібліотеками. До них додаються різні функції, такі як функції, за допомогою яких можна зателефонувати для керування обладнанням. Якщо у вас не було цих функцій, вам потрібно буде поспілкуватися безпосередньо зі спеціальними регістрами, щоб контролювати все. Ось як зазвичай робиться вбудоване програмування. Це швидко, але навчитися та зрозуміти це може бути досить важко.

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

Все це означає, що ви, ймовірно, можете без проблем перенести загальний код C ++ безпосередньо до Arduino. Однак для повернення іншим шляхом може знадобитися незначне редагування.

На практиці ...
Сказавши все це, програмування для Arduino зовсім не те саме, що загальне програмування на C ++. Хоча багато відмінностей є загальними для всіх вбудованих програмувань (наприклад, обмежена пам'ять та потужність обробки).

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

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


25

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

По-перше, компілятор / IDE Arduino приймає C і C ++ такими, які є. Насправді багато бібліотек написані на C ++. Значна частина основної системи не орієнтована на об'єкти, але це може бути.

Таким чином, "мова ардуїно" є 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-х бітових, які використовує комп'ютер. Це в основному вплине на кількість інформації, яку ви можете зберігати в змінній.

Якщо ви зовсім новачок у світі Ардуїно, вам слід знайти навчальний посібник, оскільки там багато хороших.


Ви згадуєте пам’ять. У мене є Due, який має 96 КБ оперативної пам’яті. Але останнє, що я хочу, - це те, що вертоліт вийшов з ладу через витік пам’яті (маючи на коптері дуже дорогу камеру).
Друг Кіма

Чи обробляється пам'ять на C ++ автоматично (як збирач сміття на Java), якщо не вказано інше?
Друг Кіма

2
Стандарт C ++ не дає жодних гарантій щодо розміру пам'яті - c ++ вже працює на вбудованому обладнання без змін.
Майкл Торп

2
Ви описуєте відмінності між апаратними платформами, але не C ++ там.
Кібергіббони

5
@FriendofKim У C ++ є два різні способи інстанціювання змінних / об'єктів. Якщо ви інстанціонуєте їх локально (наприклад int blah = 5;), вони будуть автоматично знищені, коли вони вийдуть за межі (тобто в кінці циклу або функції). Однак, якщо ви інстанціонуєте їх на купі (наприклад int *blah = new int(5);), тоді вам потрібно їх звільнити самостійно. Зазвичай не варто використовувати дані купи у вбудованому програмуванні.
Пітер Блумфілд

14

--- Оновлення 170412
Я написав свою оригінальну відповідь три роки тому з точки зору існуючого чіткого "Arduino C ++". Мова, що використовується в IDE, є стандартною C ++, оскільки вона реалізована компілятором GNU C ++. "Очевидні" відмінності повстають, оскільки IDE зробить деяку попередню обробку, щоб допомогти новачкам мови уникнути пари 'gotcha', заповнивши деякі #includes, f / ex. Але ви можете - і я це - написати правильний C ++ до нього і отримати саме те, що ви очікуєте отримати.
--- завершення оновлення

Обмежте використання мовних функцій C ++ тими, чию реалізацію ви повністю розумієте. Є деякі функції, які компілюються до більш ресурсомісткого коду, ніж це очевидно з читання вихідного коду. Факультативно генерований .lss (об'єднаний джерело та збірка) перелік може дати вам гарне уявлення про те, що робив компілятор C ++, коли ви не шукали.

На ваше запитання щодо пам'яті: C ++ не збирає сміття. Мови на основі стека, такі як C і C ++, виділяють тимчасове сховище в стеку для автоматичних змінних при введенні функції, яке потім вивільняється, коли функція повертається, але це не є справжнім збиранням сміття. Об'єкти, створені в купі або глобальній пам'яті, живуть, поки ви явно не видалите їх. Переконайтеся, що ви знаєте, де, коли і протягом якого часу будуть створюватися різні види об’єктів. Ви дійсно не хочете, щоб ваші кодування newта delete-ing об'єкти були вольово-невільно. Вони будуть вбудовані в купу пам’яті, фрагментуючи її і змушуючи перерости в стек. Ось тоді ваш код - і ваш приємний «вертоліт» - збій.

C робить менше для вас , так що він може зробити менше для вас. Це не поганий вибір. C з кількома функціями C ++ може стати ще кращим вибором, якщо ви вибираєте додаткові функції з розумом.C ++, якщо це два варіанти:

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

  • Будучи стандартним, C ++ є портативним. Потрібно оновити процесор? Все, окрім специфічного для кремнію коду, буде портовим до нового. Потрібно змінити набір інструментів, систему розробки, хост ОС? C ++ буде підтримуватися всюди. Хоча Arduino IDE працюватиме де завгодно, де підтримується Java, це єдиний інструмент, який використовує Arduino C ++, і це дуже обмежений інструмент. Якщо ви хочете використовувати Eclipse, засоби AVR, переходити босоніж в командному рядку, розроблятись в Emacs або будь-якому іншому середовищі, яке ви віддаєте перевагу, стандарт C ++ буде підтримуватися.

  • Arduino IDE робить все за вашою спиною - зокрема, він #include .h файли, коли він вважає, що вам потрібні. Навіть якщо це правильно, ви дуже хочете написати або принаймні побачити і зрозуміти все, що збирається бачити компілятор. Мови програмування не створені для комп’ютерів (комп'ютери їдять шматочки на сніданок); вони створені для людей, зокрема для людей, які стежать за вами у проекті, найважливішим з яких може бути ... ти! швидше за все, виправте. Вам дуже хочеться бачити все, що бачить компілятор.


2
Це дійсно хороша відповідь. Здається зрозуміло, що вам подобається C ++ і що мені це також подобається! ... Якщо серйозно, я перескочу прямо на C ++, як тільки зрозумію, як працює "зв'язок" з різними датчиками тощо.
Друг Кіма

Чи знаєте ви якісь хороші книги на цю тему? (Підходить для мене, хто роками програмував іншими мовами, і потрібна лише "вбудована частина" C ++.)
Друг Кім

Як ви вважаєте, прискорений C ++ - це гарна книга для цього?
Друг Кіма

2
Я б хотів, щоб я міг вам допомогти з «правильною» книгою, але я прийшов до C ++ із цілим рядом С за мною, а мова програмування Керніган і Річі - «С» мова все ще є моєю книжкою (поганий каламбур) для всього, що не є явно C ++ , та Довідковий посібник для анотованих C ++ Ellis & Stroustrup для C ++. Але для запису на апаратне забезпечення ви добре переглянете деякі бібліотеки пристроїв, що надаються користувачами на Arduino.cc . Почніть налаштування портів вводу-виводу з функціями pinMode (), digitalWrite () та digitalRead (), потім їх аналоговими аналогами
вводу-

1
... плануєте писати безпосередньо в регістри вводу / виводу для покращення швидкості та простору пам'яті. Такі програми, як blinky.cpp і hello.cpp - хороші місця, щоб почати возитися з обладнанням. Додайте простий мультиметр і кілька світлодіодів з правильними обмежувачами струму, що постійно спаяні на одній нозі, і ви повинні мати можливість бачити реальні, якщо прості, результати ваших зусиль. Після цього прочитайте описи для будь-якого обладнання, яке вас цікавить, щоб дізнатися, які сигнали ви можете прочитати / повинні записати на них, щоб змусити їх грати. Датчики температури прості у використанні і чи не всім потрібен холодильник? Веселіться!
Дж.Роберт

10

На мій досвід, найкраще уникати нових та видаляти під час роботи на машинах з обмеженою пам’яттю.

  • Саме управління пам’яттю використовує цінні програмні та оперативні пам’яті
  • Вектори ISR встановлюються при компіляції tme. Для екземпляра класу важко (неможливо?) Вимагати запиту ISR під час виконання
  • Як правило, ви будете знати під час компіляції, які екземпляри класу вам потрібні - напр., 3 кнопкових розвідника, драйвер дисплея та дворядковий драйвер дисплея
  • Управління пам'яттю вводить невідомі затримки під час використання нового чи видалення.

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


Будучи абсолютно новим у С ++, у мене є запитання щодо ЗПСШ. Це погана ідея пам'яті розумно використовувати її? Якщо ні, то як його можна додати (Eclipse)? Я створив компілятор AVR і його добре працює.
Друг Кіма

1
Все, що ви говорите, правильно, але я не бачу, як це відповідь на питання ОП. newі deleteвони доступні і в Arduino IDE.
jfpoilpret

Це не відповідь, а дуже корисна інформація, яку я дуже ціную.
Друг Кіма

8

Як було сказано в декількох відповідях, якщо ви загалом програмуєте вбудовану систему, вам слід уникати нових, якщо ви не керуєте своєю власною масою пам’яті та не знаєте, якими будуть життєві цикли вашого об’єкта. Статичні змінні чи змінні стека набагато безпечніші. Слід сказати, що один розповсюджений трюк для управління такими речами, як буфери змінної довжини, виділені протягом тривалості функції, - це автоматична змінна (у стеці), яка є об'єктом, який викликає нове у своєму конструкторі, а потім покласти видалення в деструктор тому, коли об'єкт виходить за межі області, буфер випускається назад до купи. Знову ж таки, це звичайно обмежене використання в невеликих мікросередовищах, але це приємна модель пам’ятати.


6

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

Uno має лише 2048 байт оперативної пам’яті. Бібліотека моєї матриці зайняла 3/4 тієї, що залишило мені близько 400 байтів для гри. Оскільки я маю намір "модернізувати" проект в якийсь момент, щоб запустити кілька ігор з однією і тією ж базою програм на більш потужній Due, я розробив код з директорами OO і багато спадкових класів. (Ігровий клас був успадкований за допомогою віртуального оновлення та малювання дзвінків; ігрові сутності були успадковані).

У мене майже не вистачило пам’яті, лише додавши загарбників. Я намагався зберегти пам’ять шляхом бітового поля змінних їхніх членів, але знову вибіг, додаючи об'єкти щита. Після трохи більше вискоблювання я вибіг додаючи бомби / кулі. У цей момент я переглянув код і видалив усі "віртуальні" теги (усі прототипи мого класу побудовані з фрагмента Visual Assist, а деструктори - всі віртуальні автоматично). Це вдвічі скоротило моє використання пам’яті, звільнившись достатньо, щоб можна було виконати код.

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

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


4

Мова Arduino - це C ++ (хоча зазвичай реалізується у стилі, схожій на "C з класами", що насправді є досить поширеним у світі мікроконтролерів вбудованих систем). Кінець історії. Досить з людьми, які думають, що це вже інша мова! Він використовує компілятор g ++.

Доказ:

Увімкніть багатослівний вихід під час компіляції у налаштуваннях та завантажте, і ви багато чого навчитесь, читаючи ці рядки.

Ось додаткове розуміння:

Мої власні слова:

Код Ардуїно - C ++. Основні функції Arduino - це просто набір класів і бібліотек C ++, які ви можете використовувати. Він будується та компілюється за допомогою компілятора GNU gcc / g ++ . Ваші настройки setup () та loop () просто поміщаються в обов'язкову функцію main () ( тут насправді - зауважте, що файл "main.cpp", який є вихідним файлом C ++) автоматично для вас, і є додаткові попередня обробка зроблена, щоб переконатися, що це дійсна програма C ++ (наприклад, сканування всіх прототипів функцій [ака: декларації] для вас, щоб ви могли використовувати функцію, навіть якщо її прототип з’явиться пізніше у вашому файлі .ino). Значна частина Arduino написана "C стилем", і тому потрібні # extern "C" {}дужки навколо неї, щоб запобігти C ++ відФункція "управління іменами" (також відома як "прикраса імен / прикраса імені" ) викликає функції 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, щоб написати свій код. Потім можна натиснути назад на ID Arduino для складання та завантаження. Якщо ви їдете з Eclipse, у Eclipse є такі способи (інші відповіді див. Тут, а також статтю Eclipse на майданчику Arduino тут також), тож подумайте і про використання цих методів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.