Перейти к содержанию

На каком языке программируют Arduino?

Обновлено Редакция GAW

Скетч Arduino — это программа на C++. Arduino IDE собирает её тем же компилятором, что и любой проект для AVR: по файлу platform.txt ядра ArduinoCore-avr для C++ вызывается avr-g++ с флагами -std=gnu++11 -Os -fno-exceptions, для C — avr-gcc с -std=gnu11.

ЧтоЧем является
Файл скетча .inoисходный текст на C++
pinMode(), digitalWrite(), delay(), Serialфункции и классы ядра Arduino
main()добавляет ядро, в скетче её нет
Компилятор для UNOavr-g++, стандарт gnu++11

Где main()

В обычной программе на C++ выполнение начинается с main(). В скетче её нет, потому что ядро добавляет свою (cores/arduino/main.cpp):

int main(void) {
  init();
  initVariant();
  setup();
  for (;;) {
    loop();
    if (serialEventRun) serialEventRun();
  }
}

Сначала init() настраивает таймеры и АЦП, потом один раз выполняется ваш setup(), а loop() повторяется бесконечно. Что именно делает init() и как устроены millis(), analogWrite() и analogRead(), разбирает статья «Arduino и AVR».

Что из этого следует

Можно пользоваться почти всем, что есть в C++: классами, шаблонами, перегрузкой. Исключения выключены флагом -fno-exceptions. Без ядра Arduino тот же микроконтроллер программируют на C с регистрами — как в статье «Программирование AVR». Для больших проектов удобнее среда PlatformIO, а ошибки компиляции и работы скетча помогает искать ответ «Как проверить скетч Arduino?».

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

Можно ли писать для Arduino на чистом C?

Да: в ядре ArduinoCore-avr есть и компилятор C — avr-gcc в режиме gnu11, и файлы на C собираются вместе со скетчем. Но сам скетч .ino считается программой на C++, а функции ядра вроде digitalWrite() доступны и из C++, и из C-файлов проекта.

Можно ли использовать исключения C++ в Arduino?

В ядре AVR — нет: по platform.txt ArduinoCore-avr компилятор вызывается с флагом -fno-exceptions, то есть исключения выключены. Классы, шаблоны, перегрузка функций при этом работают.

Можно ли программировать Arduino на Python?

Микроконтроллер ATmega328P выполняет только машинный код, поэтому программа для UNO собирается компилятором C++ в прошивку. Python может работать на компьютере и общаться с Arduino по последовательному порту, но не внутри UNO.

Источники

  1. Arduino. ArduinoCore-avr, коммит 11b9130 (github.com/arduino/ArduinoCore-avr) — platform.txt: компилятор C — avr-gcc с -std=gnu11, компилятор C++ — avr-g++ с -std=gnu++11 -Os -fno-exceptions; cores/arduino/main.cpp — main() вызывает init(), initVariant(), setup(), затем в бесконечном цикле loop() и serialEventRun()
  2. Arduino. Blink (Built-in Examples, docs-content, last revision 2015/07/28) — пример использует pinMode(LED_BUILTIN, OUTPUT), digitalWrite() и delay(1000)

Нашли ошибку?