Ошибка компиляции при запуске любого скетча
Offline
Зарегистрирован: 09.01.2016
Доброго времени суток,
при попытке компиляции любого скетча возникает ошибка:
Arduino: 1.6.8 Hourly Build 2016/01/08 12:50 (Windows XP), Плата:"Arduino/Genuino Uno" Exception 0xc000001d 0x1003f 0x0 0x508549 PC=0x508549 math.initВ·1() c:/go/src/math/pow10.go:34 +0x19 math.init() c:/go/src/math/unsafe.go:21 +0x3f strconv.init() c:/go/src/strconv/quote.go:455 +0x45 os/exec.init() c:/go/src/os/exec/lp_windows.go:123 +0x54 main.init() c:/jenkins/workspace/arduino-builder-windows/main.go:386 +0x49 goroutine 2 [runnable]: runtime.forcegchelper() c:/go/src/runtime/proc.go:90 runtime.goexit() c:/go/src/runtime/asm_386.s:2287 +0x1 goroutine 3 [runnable]: runtime.bgsweep() c:/go/src/runtime/mgc0.go:82 runtime.goexit() c:/go/src/runtime/asm_386.s:2287 +0x1 eax 0x10c9e068 ebx 0x633d88 ecx 0x10c94000 edx 0x633d88 edi 0x0 esi 0x4c98 ebp 0x0 esp 0x10c9df88 eip 0x508549 eflags 0x10206 cs 0x1b fs 0x3b gs 0x0 arduino-builder возвратил 2 Ошибка компиляции.
Драйвера поставил, плату выбрал, порт выбрал.
В чём проблема, и как её исправить?
(С Arduino работаю в первый раз)
Первая прошивка
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель.
- Неисправен USB порт компьютера.
- Неисправен USB порт Arduino.
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка.
- Попробуйте другую плату, чтобы исключить часть проблем из списка.
- На плате Arduino сгорел диод по питанию USB.
- Плата Arduino сгорела полностью из-за неправильного подключения питания или короткого замыкания
2. Компьютер издаст характерный сигнал подключения нового оборудования, а при первом подключении появится окошко “Установка нового оборудования”. Если этого не произошло:
- См. предыдущий список неисправностей.
- Кабель должен быть data-кабелем, а не “зарядным”.
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб.
- Не установлены драйверы для Arduino.
3. В списке портов (Arduino IDE/Инструменты/Порт) появится новый порт, отличный от COM1. Если этого не произошло:
- См. предыдущий список неисправностей.
- Некорректно установлен драйвер CH341.
- Если список портов вообще неактивен – драйвер Arduino установлен некорректно, вернитесь к установке
- Возникла системная ошибка, обратитесь к знакомому компьютерщику
4. Выбираем свою плату. Если это Arduino Nano, выбираем в ИнструментыПлатаArduino Nano. Если другая – выбираем другую. Нажимаем стрелочку в левом верхнем углу (загрузить прошивку). Да, загружаем пустую прошивку.
- [Для Arduino Nano] В микроконтроллер китайских нанок зашит “старый” загрузчик, поэтому выбираем ИнструментыПроцессорATmega328p (Old Bootloader). Некоторые китайцы зашивают в свои платы новый загрузчик, поэтому если прошивка не загрузилась (загрузка идёт минуту и вылетает ошибка avrdude: stk500_getsync()) – попробуйте сменить пункт Процессор на ATmega328p.
Если появилась надпись “Загрузка завершена” – значит всё в порядке и можно прошивать другие скетчи. В любом случае на вашем пути встретятся другие два варианта событий, происходящих после нажатия на кнопку “Загрузка” – это ошибка компиляции и ошибка загрузки. Вот их давайте рассмотрим более подробно.
Ошибки компиляции
Возникает на этапе компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать.
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека <название файла>, и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Возможно поможет урок по оптимизации кода.
Частые ошибки в коде, приводящие к ошибке компиляции
- expected ‘,’ or ‘;’ – пропущена запятая или точка запятой на предыдущей строке
- stray ‘320’ in program – русские символы в коде
- expected unqualified-id before numeric constant – имя переменной не может начинаться с цифры
- … was not declared in this scope – переменная или функция используется, но не объявлена. Компилятор не может её найти
- redefinition of … – повторное объявление функции или переменной
- storage size of … isn’t known – массив задан без указания размера
Ошибки загрузки
Возникают на этапе, когда программа успешно скомпилирована и производится загрузка в плату по кабелю. Ошибка может возникать как по причине неисправностей железа, так и из-за настроек программы и драйверов.
- USB кабель, которым подключается Arduino, должен быть Data-кабелем, а не кабелем только для зарядки. Нужным нам кабелем подключаются к компьютеру плееры и смартфоны.
- Причиной ошибки загрузки являются не установленные/криво установленные драйвера CH340, если у вас китайская NANO.
- Также будет ошибка avrdude: ser_open(): can’t open device, если не выбран COM порт, к которому подключена Arduino. Если кроме COM1 других портов нет – читай два пункта выше, либо попробуй другой USB порт, или вообще другой компьютер.
- Большинство проблем при загрузке, вызванных “зависанием” ардуины или загрузчика, лечатся полным отключением ардуины от питания. Потом вставляем USB и по новой прошиваем.
- Причиной ошибки загрузки может быть неправильно выбранная плата в “Инструменты/Плата”, а также неправильно выбранный процессор в “Инструменты/Процессор”. Также в свежих версиях IDE нужно выбирать ATmega328P (Old Bootloader) для китайских плат NANO.
- Если у вас открыт монитор COM порта в другом окне Arduino IDE или плата общается через СОМ порт с другой программой (Ambibox, HWmonitor, SerialPortPlotter и т.д.), то вы получите ошибку загрузки, потому что порт занят. Отключитесь от порта или закройте другие окна и программы.
- Если у вас задействованы пины RX или TX – отключите от них всё! По этим пинам Arduino общается с компьютером, в том числе для загрузки прошивки.
- Если в описании ошибки встречается bootloader is not responding и not in sync, а все предыдущие пункты этого списка проверены – с вероятностью 95% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет критических ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
- # Pragma message… – это просто сообщения, оставленные разработчиком проекта или библиотеки. Чаще всего номер версии и прочая информация.
- Недостаточно памяти, программа может работать нестабильно – Чуть выше этого предупреждения обычно идёт информация о задействованной памяти. Память устройства можно добивать до 99%, ничего страшного не случится. Это флэш память и во время работы она не изменяется. А вот динамическую память желательно забивать не более 85-90%, иначе реально могут быть непонятные глюки в работе, так как память постоянно “бурлит” во время работы. НО. Это зависит от скетча и в первую очередь от количества локальных переменных. Можно написать такой код, который будет стабильно работать при 99% занятой SRAM памяти. Так что ещё раз: это всего лишь предупреждение, а не ошибка.
FAQ
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс Flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов. Подробнее в этом уроке.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. Подробнее в этом уроке.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу.
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь.
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
13-12-2020, 16:31
6 комментариев
Даже опытные программисты-«ардуинщики» могут столкнуться с ошибками компиляции. Исправить их не сложно, а вот найти порой не так просто. Мы решили рассказать сегодня в деталях, какие системные ошибки чаще возникают на различных платах Ардуино, как их исправить и по возможности избежать.
Для начала рассмотрим базовые, так называемые синтаксические ошибки. Они встречаются чаще всего у новичков, но и опытные электронщики с ними точно знакомы не понаслышке. Искать их обычно супер-просто – в Arduino IDE некорректный синтаксис выделяется построчно (таким образом значительно легче отыскать неточность в кодах). Обычно это: отсутствие скобки в конце команды, пропуск этой самой служебной команды или слова, нехватка важных функций, неправильное их написание и т.д.
Для быстрого поиска ошибки советуем рассмотреть строку-подсказку. Ничего не помогло? Тогда для вас наша подборка наиболее распространенных синтаксических ошибок:
С синтаксисом все понятно – вставляем пропущенные символы, убираем лишние знаки, возвращаем функции по умолчанию.
Напомним, в среде разработки Ардуино IDE можно заливать скетчи для различных микроконтроллеров. По умолчанию обычно указана плата Genuino Uno. Если вы работаете с Mega, следует выбрать именно эту платформу (меню «Сервис»), иначе вас ожидает неприятное предупреждение: “programmer is not responding”.
Ошибка компиляции для платы Arduino Uno чаще всего возникает из-за проблем, связанных с библиотеками, например, неправильно подключили, не то ПО инсталлировали. В этом случае вы увидите напоминание “fatal error: … No such file or directory” (библиотека не перенесена в папку libraries) или “redefinition of void setup”.
Обозначенная на скриншоте ERROR означает, что программирование завершилось некорректно (расшифровываем: внутренние проблемы с компилятором, не обновили версию IDE, сбой в библиотеке, неправильный выбор разрядности операционной системы и др.).
Важно! Не забывайте использовать подсказки приложения – они очень помогают. Включаем тут: Файл -> Настройки -> «Показать подробный вывод во время компиляции».
Что делать, если произошла ошибка при загрузке скетча Arduino Nano. Тут могут быть те же причины, что мы описали выше. Особых отличий в компиляции плат нет, главное, их правильный выбор первоначально. Однако часто пользователи настраивают не те показатели скорости порта: 9600 вместо необходимых 57600 либо не имеют соответствующих драйверов на устройствах – все это нужно проверить и исправить!
Compiling the velocity_control.ino example and all other sketches I have tried, using v. 2.2.1, targeting Arduino Leonardo in Arduino IDE on Windows exit with the following errors:
C:Users*****DocumentsArduinolibrariesSimple_FOCsrcdrivershardware_specificatmega32u4_mcu.cpp: In function 'int _configure6PWM(long int, float, int, int, int, int, int, int)':
C:Users*****DocumentsArduinolibrariesSimple_FOCsrcdrivershardware_specificatmega32u4_mcu.cpp:151:1: error: a function-definition is not allowed here before '{' token
{
^
C:Users*****DocumentsArduinolibrariesSimple_FOCsrcdrivershardware_specificatmega32u4_mcu.cpp:166:151: error: a function-definition is not allowed here before '{' token
void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, float dead_zone, int pinA_h, int pinA_l, int pinB_h, int pinB_l, int pinC_h, int pinC_l){
^
C:Users***DocumentsArduinolibrariesSimple_FOCsrcdrivershardware_specificatmega32u4_mcu.cpp:170:1: error: expected '}' at end of input
}
^
exit status 1
Error compiling for board Arduino Leonardo.
Further, I also get multiple warnings like
C:Users*****DocumentsArduinolibrariesSimple_FOCsrc/communication/Commander.h:210:68: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
void target(FOCMotor* motor, char* user_cmd, char* separator = " ");
on both Leonardo but also on Arduino MEGA, but there they don’t prevent me from compiling, so I am not sure if they are related to the error.
Страница 1 из 4
-
Не работает датчик влажности почвы. Упорно выдает «Ошибка компиляции». Видимо, проблемы с подключением библиотеки
-
Видимо, да. Пичалька.
-
Та же ерунда с библиотекой мультисерво.
-
Ответы — супер. Я скачал 3 библиотеки, но ни одна не работает. Как их правильно расположить, может папка какая нужна специально для этой цели
-
Какой вопрос — таков ответ. У нас хрустальных шаров нету. Чо ты делал, как делал, какую ошибку получил — ХЗ. Ответ тоже — ХЗ.
-
Комп это и выдает «Ошибка компиляции»
Вот полный текст:Arduino: 1.6.6 (Windows 7), Плата:»Arduino Leonardo»
sketch_apr04a.ino:1:22: fatal error: HqcDht11.h: No such file or directory
compilation terminated.
Ошибка компиляции.Это сообщение будет содержать больше информации чем
«Отображать вывод во время компиляции»
включено в Файл > Настройки -
А чо гугал перевоччик говорит про «No such file…»?
-
Данный файл или каталог отсутствует
компиляция прекращена -
Я так понимаю, не может найти библиотеку среди прочих файлов компьютера
-
Ну почитай, вдруг поймешь чо
https://wiki.iarduino.ru/page/Installing_libraries
Только помни, после установки биб-ки из IDE НАДО ВЫЙТИ и потом запустить снова -
Я создал отдельную папку с этими библиотеками. Один вопрос — а зачем я это сделал?
-
Нинаю. Теперь IDE их найти и не может
-
Переместил. Чуда не произошло, не работает
-
Куда переместил, чо переместил, выходил из IDE, или нет, ХЗ. Мой ответ опять такой же. Покидаю тему.
-
Ну либо чюдо сетаки случица и ты научишься ВНЯТНО задавать вопросы
-
Библиотеки переместил, все по инструкции! IDE перезапустил 3 раза! Но не работает!
-
Такого не бывает.
Покажи ка СВОЙ полный путь к папке скетчей Ардуино. Лучше скриншот. Вот как у меня:
DetSimen и b707 нравится это.
-
БиЛл ШиФр2, добавьте библиотеки через Скетч — Подключить библиотеку — Управлять библиотеками (или Добавить ZIP библиотеку)
Страница 1 из 4