Недостаточно памяти программа может работать нестабильно arduino
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
mechanic
ЧИТАЕМ, НЕ ЛЕНИМСЯ!
99% всех проблем прошивки написаны здесь!
1. Плата подключается к компьютеру по USB, на ней должны замигать светодиоды. Если этого не произошло:
- Неисправен USB кабель
- Неисправен USB порт компьютера
- Неисправен USB порт Arduino
- Попробуйте другой компьютер, чтобы исключить часть проблем из списка
- Попробуйте другую плату (желательно новую), чтобы исключить часть проблем из списка
- На плате Arduino сгорел входной диод по линии USB из-за короткого замыкания, устроенного пользователем при сборке схемы
- Плата Arduino сгорела полностью из-за неправильного подключения пользователем внешнего питания или короткого замыкания
- См. предыдущий список неисправностей
- Кабель должен быть data-кабелем, а не “зарядным”
- Кабель желательно втыкать напрямую в компьютер, а не через USB-хаб
- Не установлены драйверы Arduino (во время установки IDE или из папки с программой), вернитесь к установке.
Возникает на этапе сборки и компиляции прошивки. Ошибки компиляции вызваны проблемами в коде прошивки, то есть проблема сугубо софтварная. Слева от кнопки “загрузить” есть кнопка с галочкой – проверка. Во время проверки производится компиляция прошивки и выявляются ошибки, если таковые имеются. Ардуино в этом случае может быть вообще не подключена к компьютеру.
- В некоторых случаях ошибка возникает при наличии кириллицы (русских букв) в пути к папке со скетчем. Решение: завести для скетчей отдельную папочку в корне диска с английским названием.
- В чёрном окошке в самом низу Arduino IDE можно прочитать полный текст ошибки и понять, куда копать
- В скачанных с интернета готовых скетчах часто возникает ошибка с описанием название_файла.h no such file or directory. Это означает, что в скетче используется библиотека , и нужно положить её в Program Files/Arduino/libraries/. Ко всем моим проектам всегда идёт папочка с использованными библиотеками, которые нужно установить. Также библиотеки всегда можно поискать в гугле по название файла.
- При использовании каких-то особых библиотек, методов или функций, ошибкой может стать неправильно выбранная плата в “Инструменты/плата“. Пример: прошивки с библиотекой Mouse.h или Keyboard.h компилируются только для Leonardo и Micro.
- Если прошивку пишете вы, то любые синтаксические ошибки в коде будут подсвечены, а снизу в чёрном окошке можно прочитать более детальное описание, в чём собственно косяк. Обычно указывается строка, в которой сделана ошибка, также эта строка подсвечивается красным.
- Иногда причиной ошибки бывает слишком старая, или слишком новая версия Arduino IDE. Читайте комментарии разработчика скетча
- Ошибка недостаточно свободного места возникает по вполне понятным причинам. Если в проекте используется плата Nano на процессоре 328p, а вы сэкономили три рубля и купили на 168 процессоре – скупой платит дважды. Оптимизация: статическая память – память, занимаемая кодом (циклы, функции). Динамическая память занята переменными.
- 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% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет несовместимых с жизнью ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
Ошибка при загрузке скетча // Недостаточно памяти, программа может работать нестабильно.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Помогите пожалуйста решить проблему. При загрузке скетча пишет:
Скетч использует 10894 байт (75%) памяти устройства. Всего доступно 14336 байт.Глобальные переменные используют 1000 байт (97%) динамической памяти, оставляя 24 байт для локальных переменных. Максимум: 1024 байт.
ЗАРАНЕЕ СПАСИБО.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Какую проблему-то решить? Памяти допаять вам в МК что ли?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Помогите пожалуйста решить проблему.
А проблема-то есть? Она работает или нет? Ну, мало памяти, но может хватает? Вы уж толком говорите.
А так - какие проблемы? Сокращать память, как я понимаю для Вас не вариант, ну тогда берите Мегу - туда влезет.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Фигня все это, у меня один скетч при 90 % стабильно уж пару месяцев работает, зависит от самого скетча, количества вызовов процедур (стек), количества сторонних библиотек и ещё кучи причин.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вряд ли будет работать, стоит переходить на иной камень. Мой ХШ подсказывает, что сама программа отожрет в худшем случае около 10 байт со стека. Но, в ней активно работает lcd.print(), который есть наследник как и Serial.print() от всего стека классов stream, а там жрется не так уж и мало, вот сколько точно уже не помню, но вряд ли меньше 14 байт. Там тучно есть около 9 вложенных вызовов "друг в друга", из-за чего и делал свою часть библиотеки - аналога работы с LCD, а это явно уже 18 байт стека как миниум, без локальных переменных.
Ошибка при загрузке скетча // Недостаточно памяти, программа может работать нестабильно.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Помогите пожалуйста решить проблему. При загрузке скетча пишет:
Скетч использует 10894 байт (75%) памяти устройства. Всего доступно 14336 байт.Глобальные переменные используют 1000 байт (97%) динамической памяти, оставляя 24 байт для локальных переменных. Максимум: 1024 байт.
ЗАРАНЕЕ СПАСИБО.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Какую проблему-то решить? Памяти допаять вам в МК что ли?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Помогите пожалуйста решить проблему.
А проблема-то есть? Она работает или нет? Ну, мало памяти, но может хватает? Вы уж толком говорите.
А так - какие проблемы? Сокращать память, как я понимаю для Вас не вариант, ну тогда берите Мегу - туда влезет.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Фигня все это, у меня один скетч при 90 % стабильно уж пару месяцев работает, зависит от самого скетча, количества вызовов процедур (стек), количества сторонних библиотек и ещё кучи причин.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вряд ли будет работать, стоит переходить на иной камень. Мой ХШ подсказывает, что сама программа отожрет в худшем случае около 10 байт со стека. Но, в ней активно работает lcd.print(), который есть наследник как и Serial.print() от всего стека классов stream, а там жрется не так уж и мало, вот сколько точно уже не помню, но вряд ли меньше 14 байт. Там тучно есть около 9 вложенных вызовов "друг в друга", из-за чего и делал свою часть библиотеки - аналога работы с LCD, а это явно уже 18 байт стека как миниум, без локальных переменных.
Итак, разобрались со средой разработки, теперь можно загрузить прошивку. Рекомендую загрузить пустую прошивку, чтобы убедиться, что все драйвера установились и плата вообще прошивается. Также лучше делать это с новой или заведомо рабочей платой.
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% сдох загрузчик. Второй неприятный исход – загрузчик “слетел”, и его можно прошить заново.
Предупреждения
Помимо ошибок, по причине которых проект вообще не загрузится в плату и не будет работать, есть ещё предупреждения, которые выводятся оранжевым текстом в чёрной области лога ошибок. Предупреждения могут появиться даже тогда, когда выше лога ошибок появилась надпись “Загрузка завершена“. Это означает, что в прошивке нет критических ошибок, она скомпилировалась и загрузилась в плату. Что же тогда означают предупреждения? Чаще всего можно увидеть такие:
Завершая раздел Введение в Arduino поговорим о вопросах, которые очень часто возникают у новичков:
- Ардуину можно прошить только один раз? Нет, несколько десятков тысяч раз, всё упирается в ресурс Flash памяти. А он довольно большой.
- Как стереть/нужно ли стирать старую прошивку при загрузке новой? Память автоматически очищается при прошивке, старая прошивка автоматически удаляется.
- Можно ли записать две прошивки, чтобы они работали вместе? Нет, при прошивке удаляются абсолютно все старые данные. Из двух прошивок нужно сделать одну, причём так, чтобы не было конфликтов. Подробнее в этом уроке.
- Можно ли “вытащить” прошивку с уже прошитой Ардуины? Теоретически можно, но только в виде нечитаемого машинного кода, в который преобразуется прошивка на С++ при компиляции, т.е. вам это НИКАК не поможет, если вы не имеете диплом по низкоуровневому программированию. Подробнее в этом уроке.
- Зачем это нужно? Например есть у нас прошитый девайс, и мы хотим его “клонировать”. В этом случае да, есть вариант сделать дамп прошивки и загрузить его в другую плату на таком же микроконтроллере.
- Если есть желание почитать код – увы, прошивка считывается в виде бинарного машинного кода, превратить который обратно в читаемый Си-подобный код обычному человеку не под силу.
- Вытащить прошивку, выражаясь более научно – сделать дамп прошивки, можно при помощи ISP программатора, об этом можно почитать здесь.
- Снять дамп прошивки можно только в том случае, если разработчик не ограничил такую возможность, например записав лок-биты, запрещающие считывание Flash памяти, или вообще отключив SPI шину. Если же разработчик – вы, и есть желание максимально защитить своё устройство от копирования – гуглите про лок-биты и отключение SPI
Видео
Темы из этой же категории
Vlad-I-Mir
Vlad-I-Mir
МЕСТНЫЙ СТАРОЖИЛА
Попробуйте заменить нано на МЕГА. Там памяти по более и не только.
Зы. А вдруг? Чем чёрт не шутит. Зато все узнаем.
Robinson1957
Robinson1957
МЕСТНЫЙ СТАРОЖИЛА
Заменить загрузчик на optiboot он вместо обычного 1kB занимает 512b. Тогда влезет. Да и работает лучше.
AnLaz
AnLaz
МЕСТНЫЙ
Заменить загрузчик на optiboot он вместо обычного 1kB занимает 512b. Тогда влезет. Да и работает лучше.
Попробуйте заменить нано на МЕГА. Там памяти по более и не только.
Зы. А вдруг? Чем чёрт не шутит. Зато все узнаем.
Я думаю тысячи энтузиастов хобийного ЧПУ используют нано и уно. Поэтому памяти должно хватать, ни кто не жалуется.Vlad-I-Mir
Vlad-I-Mir
МЕСТНЫЙ СТАРОЖИЛА
Программатор USBASP | Загрузчик Optiboot | Таймер WatchDog для Arduino Pro Mini и Arduino Nano.
Учите матчасть, коль в дебри полезли.AnLaz
AnLaz
МЕСТНЫЙ
Программатор USBASP | Загрузчик Optiboot | Таймер WatchDog для Arduino Pro Mini и Arduino Nano.
Учите матчасть, коль в дебри полезли.
Спасибо за ответ. Такой программатор у меня есть. Понятие Optiboot мне было незнакомо. Значит прошивать нужно через пины (см. фото) Для этого по прежнему можно использовать arduini ID ?Вложения
Vlad-I-Mir
Vlad-I-Mir
МЕСТНЫЙ СТАРОЖИЛА
vvv1234
vvv1234
МЕСТНЫЙ СТАРОЖИЛА
Какие проценты выдает Ардуино ИД после компиляции? В этих полях
Sketch uses 23664 bytes (9%) of program storage space. Maximum is 262144 bytes.
Global variables use 3864 bytes (5%) of dynamic memory, leaving 61672 bytes for local variables. Maximum is 65536 bytes.AnLaz
AnLaz
МЕСТНЫЙ
Какие проценты выдает Ардуино ИД после компиляции? В этих полях
Sketch uses 23664 bytes (9%) of program storage space. Maximum is 262144 bytes.
Global variables use 3864 bytes (5%) of dynamic memory, leaving 61672 bytes for local variables. Maximum is 65536 bytes.Большая она, на место нано не встанет.
Вложения
vvv1234
vvv1234
МЕСТНЫЙ СТАРОЖИЛА
AnLaz
AnLaz
МЕСТНЫЙ
In file included from C:\Users\dell\Documents\Arduino\libraries\grbl/grbl.h:43:0,
C:\Users\dell\Documents\Arduino\libraries\grbl/nuts_bolts.h:56:0: warning: "max" redefined
In file included from sketch\grblUpload.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:93:0: note: this is the location of the previous definition
In file included from C:\Users\dell\Documents\Arduino\libraries\grbl/grbl.h:43:0,
C:\Users\dell\Documents\Arduino\libraries\grbl/nuts_bolts.h:57:0: warning: "min" redefined
In file included from sketch\grblUpload.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:92:0: note: this is the location of the previous definition
In file included from C:\Users\dell\Documents\Arduino\libraries\grbl/grbl.h:43:0,
C:\Users\dell\Documents\Arduino\libraries\grbl/nuts_bolts.h:61:0: warning: "bit" redefined
In file included from sketch\grblUpload.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:124:0: note: this is the location of the previous definition
Скетч использует 29762 байт (96%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1633 байт (79%) динамической памяти, оставляя 415 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.In file included from C:\Users\dell\Documents\Arduino\libraries\grbl/grbl.h:43:0,
C:\Users\dell\Documents\Arduino\libraries\grbl/nuts_bolts.h:56:0: warning: "max" redefined
In file included from sketch\grblUpload.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:93:0: note: this is the location of the previous definition
In file included from C:\Users\dell\Documents\Arduino\libraries\grbl/grbl.h:43:0,
C:\Users\dell\Documents\Arduino\libraries\grbl/nuts_bolts.h:57:0: warning: "min" redefined
In file included from sketch\grblUpload.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:92:0: note: this is the location of the previous definition
In file included from C:\Users\dell\Documents\Arduino\libraries\grbl/grbl.h:43:0,
C:\Users\dell\Documents\Arduino\libraries\grbl/nuts_bolts.h:61:0: warning: "bit" redefined
In file included from sketch\grblUpload.ino.cpp:1:0:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:124:0: note: this is the location of the previous definition
Скетч использует 29762 байт (96%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1633 байт (79%) динамической памяти, оставляя 415 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.Читайте также: