На каком языке программируют 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() | добавляет ядро, в скетче её нет |
| Компилятор для UNO | avr-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.
Источники
- 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()
- Arduino. Blink (Built-in Examples, docs-content, last revision 2015/07/28) — пример использует pinMode(LED_BUILTIN, OUTPUT), digitalWrite() и delay(1000)
Нашли ошибку?
Смотрите также
- Arduino и AVRЧто делают init(), millis(), analogWrite(), analogRead() и загрузчик
- Как проверить скетч Arduino?Verify ищет ошибки компиляции, монитор порта — ошибки логики
- PlatformIOУстановка, platformio.ini, настройки популярных плат, библиотеки, прошивка, монитор
- Прошивка AVRISP, HVPP, debugWIRE, JTAG, PDI, TPI, UPDI, загрузчики, avrdude