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

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

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

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

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

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

, 👍103

Обсуждение

Избегайте Arduino IDE, так как он не заслуживает своего названия IDE, это даже очень плохой редактор: он может быть хорош для начинающих и простых скетчей, но нужно быстро перейти к чему-то лучшему., @jfpoilpret

Visual Micro (www.visualmicro.com) предоставляет подключаемый модуль для MS Visual Studio 2013 — даже для бесплатной/экспресс-версии. Visual Mirco сам по себе не бесплатен, но он позволяет вам кодировать с помощью таких инструментов, как intellisense и подсветка синтаксиса PROPER, и даже компилировать и загружать в процессор (с небольшими трудностями для настройки)., @CharlieHanson

[Это довольно краткая разбивка](http://www.idogendel.com/en/archives/19#comment-2809) того, что подразумевается (и что на самом деле находится под капотом) «языка программирования Arduino»., @AdjunctProfessorFalcon

«C++ против языка Arduino?» — «Язык Arduino» **это** C++. Есть немного предварительной обработки, чтобы избавить вас от создания прототипов функций, но это, безусловно, C++., @Nick Gammon

Языка ардуино не существует. Это просто библиотека., @Overdrivr

Не столько к вопросу, сколько к комментариям: Atmel studio бесплатна и ИМХО лучше Visual Studio для программирования на ардуино. Также поддерживает плагин Visual Micro, хотя для программирования и отладки ардуинов он совсем не нужен., @cyberponk

Языка Ардуино нет., @PhillyNJ

Язык Arduino — это подмножество Processing, которое является подмножеством C++, и имеет несколько расширений, о которых заботятся на этапе прекомпиляции. У него нет официального названия. Это то, что есть. Среда IDE определенно не является настоящей IDE, потому что она не позволяет выполнять программы пошагово, устанавливать точки останова и т. д. Но с практикой и разумным использованием операторов Serial.println ее достаточно легко использовать. Между тем, этот вопрос не имеет смысла, так как другого выхода нет., @SDsolar

Между C++ и любым языком, который использует Arduino, определенно есть тонкие различия, которые вызовут путаницу у опытных программистов на C++. Наиболее очевидным из них является наличие идентификаторов, не требующих объявления из заголовочных файлов. Но подозреваю, что есть и другие отличия. Я объявил глобальный объект C++ и не уверен, что конструктор вызывается так же, как в программе C++., @Throw Away Account


9 ответов


Лучший ответ:

66

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

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

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

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

,

Спасибо за ваши мысли. Я буду использовать Arduino IDE, чтобы научиться управлять всеми различными аппаратными частями, такими как датчики, ЖК-экраны и т. д. Затем я перейду на C++, чтобы написать программное обеспечение для октокоптера. Вы знаете хорошую и короткую книгу для людей, которые знают другие языки? «Проблема» со многими книгами, которые я нашел, заключается в том, что они содержат так много всего, что мне не нужно, потому что я работаю на небольшом микроконтроллере Atmel, а не на компьютере с пользовательским интерфейсом., @Friend of Kim

Есть хорошая книга «Программирование на C для Arduino» Жюльена Бейля, которая полезна. Это язык C, а не C++, но он должен помочь вам понять основы., @fenix688

Хороший запрос: короткая и хорошая книга с основами C++ для программистов других языков. К сожалению, я не могу дать какие-либо рекомендации, я не знаю ни одного хорошего. На самом деле, я написал книгу с практической направленностью (разработка видеоигры) для своих студентов, но она только на испанском языке. В качестве хорошей и практичной книги по C++ я бы рекомендовал Deitel&Deitel How to Program C++, вы можете пропустить многие сложные главы., @drodri

C++ поддерживает возможности объектно-ориентированного программирования, а язык C — нет., @Chris O

С какой стати вам нужны папки для вашего кода Arduino? Он имеет только 32 КБ для работы. Я действительно не понимаю, почему так много людей не любят Arduino IDE. Это хорошо для того, для чего это предназначено. Я бы хотел, чтобы у него был встроенный эмулятор, поэтому мне на самом деле не нужно было подключать светодиоды для тестирования, и Intellisense был бы хорош, но он по-прежнему полезен, насколько это необходимо., @krowe

«Вы можете практически скопировать и вставить код Arduino в файл C/C++, и он будет работать». Не только практически. Код Arduino написан на C++, и если вы изучите исходный код библиотеки Arduino, вы обнаружите, что большинство/все функции/классы в нем являются оболочками C++ для низкоуровневых библиотек C; На самом деле в прошлом году я модифицировал код библиотеки для проекта, чтобы использовать еще несколько USART на Due (библиотека Arduino делает предположения о том, сколько будет использоваться и в каком режиме они находятся), при этом все еще имея возможность использовать абстракции, предоставляемые библиотекой Arduino., @JAB

Функции @ChrisO OO можно использовать (симулировать) и в C. Тем не менее, вам нужно иметь определенную степень знакомства с указателями на функции, чтобы вам было удобно использовать это., @asheeshr

@JAB А? Вы подразумеваете, что все порты UART могут использоваться как RX, так и TX, если вы измените библиотеку? Я имею в виду, что, поскольку есть 4 UART, можете ли вы получить, например, 8 RX вместо 4 RX и 4 TX?, @Friend of Kim

@FriendofKim Не совсем то, что я имел в виду (хотя технически вы могли бы, Due достаточно быстр, чтобы поддерживать программное решение для немегабитной последовательной связи, и у него всего 5 U (S) ARTS, в то время как библиотеки Arduino предоставляют только 4 из их, но iirc плата Due в любом случае не предоставляет контакты для одного из USART); библиотеки Arduino настраивают USART для использования асинхронного режима, но мне нужен был синхронный режим со скоростью до 6 Мбит/с (и мне пришлось использовать режим SPI, поскольку ввод должен был обрабатываться как необработанный битовый поток, поэтому без стоповых битов и т. д.), что также включало изменение конфигурации контроллера PIO по умолчанию., @JAB

Знаете ли вы, есть ли причина, по которой они накладывают эти ограничения на плату, когда микроконтроллер на самом деле их поддерживает? Или это просто плохое программирование?, @Friend of Kim

@JAB Забыл тег., @Friend of Kim

@FriendofKim Для упрощения; Одна из целей проекта Arduino — сделать программирование встраиваемых систем доступным для более широкой аудитории, чтобы все детали и мельчайшие подробности были скрыты от случайного пользователя (аналогично [Processing](http://processing.org/) , на котором фактически основана среда разработки Arduino). Более продвинутые пользователи, которым не нужны все абстракции/упрощения, предоставляемые фреймворком Arduino, могут по-прежнему использовать его в качестве основы для своей работы, если они не хотят переписывать все самостоятельно., @JAB

Как профессор, вы должны знать, что «языка Arduino» не существует: это C++ со специфическими библиотеками для Arduino., @RichieHH

Да, вы, вероятно, хотите сказать мейнтейнерам Arduino, чтобы они изменили свою главную страницу документации Arduino: https://www.arduino.cc/reference/en/, в которой они определяют ее как «язык программирования Arduino». Возможно, они тоже не знают, что это C++ с библиотеками., @drodri


15

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

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

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

,

Вы упомянули память. У меня есть Due с 96 КБ ОЗУ. Но меньше всего я хочу, чтобы коптер рухнул из-за утечки памяти (на коптере установлена очень дорогая камера)., @Friend of Kim

Обрабатывается ли память в С++ автоматически (как сборщик мусора в Java), если не указано иное?, @Friend of Kim

Стандарт С++ не дает никаких гарантий относительно размеров памяти — С++ уже работает на встроенном оборудовании без изменений., @Michael Thorpe

@MichaelThorpe Я имею в виду, вам нужно специально освобождать память, когда она вам больше не нужна? Допустим, вы определяете 20 переменных внутри бесконечного цикла, будет ли память автоматически освобождаться для каждого цикла?, @Friend of Kim

Вы описываете различия между аппаратными платформами, а не С++., @Cybergibbons

@FriendofKim В C++ существует два разных способа создания экземпляров переменных/объектов. Если вы создадите их локально (например, int blah = 5;), то они будут автоматически уничтожены, когда выйдут за пределы области видимости (т.е. в конце цикла или функции). Однако, если вы создаете их экземпляры в куче (например, int *blah = new int(5);), то вам нужно освободить их самостоятельно. Однако обычно нецелесообразно использовать данные кучи во встроенном программировании., @Peter Bloomfield

Это С++ с библиотеками Arduino., @RichieHH


53

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

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

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

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

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

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

,

Вот моя установка для Eclipse, которая отлично работает с Arduino. https://arduinoprosto.ru/q/75491/7727. Я не использую никаких плагинов Arduino, только чистый Eclipse для C/C++., @Gabriel Staples


17

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

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

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

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

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

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

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

,

Это ДЕЙСТВИТЕЛЬНО хороший ответ. Кажется очевидным, что вам нравится C++ и что он должен понравиться и мне! ... А если серьезно, я перейду сразу к C++, как только пойму, как работает "общение" с различными датчиками и т.д., @Friend of Kim

Вы знаете хорошие книги на эту тему? (Подходит для меня, который много лет программировал на других языках и нуждался только во «встроенной части» С++.), @Friend of Kim

Как вы думаете, подойдёт ли для этого книга «Ускоренный C++_»?, @Friend of Kim

Я хотел бы помочь вам с «правильной» книгой, но я пришел к C++, имея за спиной целую кучу C, а «Язык программирования C» Кернигана и Ритчи по-прежнему остается моей любимой книгой (плохой каламбур) для всего, что не относится явно к C++. , и «Справочное руководство по C++ с аннотациями» Эллиса и Страуструпа для C++. Но для записи на аппаратное обеспечение вам будет полезно взглянуть на некоторые библиотеки устройств, предоставленные пользователями на [Arduino.cc](http://arduino.cc). Начните с настройки портов ввода-вывода с помощью функций pinMode(), digitalWrite() и digitalRead(), затем их аналоговых аналогов ввода-вывода и, наконец,..., @JRobert

... планируйте запись непосредственно в регистры ввода-вывода для улучшения скорости и объема памяти. Такие программы, как blinky.cpp и hello.cpp, хорошо подходят для того, чтобы начать возиться с оборудованием. Добавьте простой мультиметр и несколько светодиодов с правильными токоограничивающими резисторами, постоянно припаянными к одной ноге, и вы сможете увидеть реальные, хотя и простые, результаты ваших усилий. После этого прочтите таблицы данных для любого интересующего вас оборудования, чтобы узнать, какие сигналы вы можете считывать/должны записывать в них, чтобы заставить их воспроизводиться. Датчики температуры просты в использовании, и разве не всем нужен регистратор в холодильнике? Веселиться!, @JRobert

Обратите внимание, что книга Эллиса и Страуструпа полна и многословна, и в ней много обсуждений голой информации, так что, возможно, это не ваш основной краткий справочник, но вы многое узнаете о C++ и о том, почему он такой, какой он есть, и делает то, что он делает. Кто-то может знать более плотную, более справочную книгу., @JRobert

Я рекомендую перенести ваше обновление в начало. В противном случае читатели будут исходить из ложного предположения, что Arduino не C++, пока не доберутся до вашего обновления. Смотрите мой ответ здесь для дополнительной информации. https://arduinoprosto.ru/q/50839/7727, @Gabriel Staples


28

Каковы преимущества языка 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 и бесплатные функции.

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

,

Хорошо, если созданные объекты (с new) не собираются мусором, мне тоже придется это изучить. Я полагаю, что любая книга по C++ расскажет об этом. Спасибо за хороший ответ!, @Friend of Kim


12

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

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

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

,

Будучи совершенно новичком в C++, у меня есть дополнительный вопрос относительно STD. Это плохая идея использовать память? Если нет, то как его можно добавить (Eclipse)? Я настроил компилятор AVR, и он работает хорошо., @Friend of Kim

Все, что вы говорите, правильно, но я не понимаю, как это является ответом на вопрос ОП. new и delete также доступны в Arduino IDE., @jfpoilpret

Это не ответ, а очень полезная информация, которую я очень ценю., @Friend of Kim


9

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

,

8

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

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

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

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

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

,

Это довольно полезный анекдотический ответ, в котором подробно описывается, как OO C ++ отстой для небольших встроенных. Я обязательно буду придерживаться процедурного программирования при использовании C++ на Arduino., @Gabriel Staples


6

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

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

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

Дополнительная информация:

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

Код Arduino является C++. Основные функции Arduino — это просто набор классов и библиотек C++, которые вы можете использовать. Он создается и компилируется с использованием компилятора GNU gcc/g++. Ваши функции setup() и loop() просто помещаются в обязательную функцию main() (прямо здесь -- обратите внимание, что файл называется "main.cpp", который является исходным файлом C++) автоматически для вас, и выполняется некоторая дополнительная предварительная обработка, чтобы убедиться, что это допустимый C++ программа (например, сканирование всех прототипов функций [иначе: объявлений] для вас, чтобы вы могли использовать функцию, даже если ее прототип появится позже в вашем .ino-файле). Однако большая часть Arduino написана в «стиле C», поэтому для нее требуются фигурные скобки # extern «C» {}, чтобы C++ не мог использовать "изменение имени" (также известное как "украшение имени" /name decoration") вызывает функции 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 и здесь), так что рассмотрите возможность использования и этих методов.

Обновление: настройка Eclipse

См. мой ответ здесь: Какие существуют другие IDE для Arduino?. Я написал подробный PDF-файл с описанием установки.

,

Начиная с третьего квартала 2023 года, основная функция была перенесена в репозитории для конкретной архитектуры. Вот два примера, один для AVR: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/main.cpp# L33 и еще один для ESP32: https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/main.cpp#L40., @j0057

@ j0057, в ядре AVR по первой ссылке вы обнаружили, что C и C++ требуют функцию main. Во второй ссылке для ESP32 функция loopTask по-прежнему не является необходимой main функцией C и C++, скорее, это задача (поток) FreeRTOS, которая разворачивается и вызывается в xTaskCreateUniversal(loopTask.. . позвоните позже в том же файле. Однако точка зрения принята, я обновлю свои ссылки в ответе., @Gabriel Staples