Как очистить память на Arduino Uno
Обновлено: 21.11.2024
Что происходит, когда в Arduino или другом микроконтроллере заканчивается оперативная память (ОЗУ)? Обычно Arduino сходит с ума и перезагружается в странных местах. Что еще хуже, эти сбросы происходят в странных местах, часто отправляя вас в кроличью нору в поисках ошибок, которых никогда не было.
Что такое память?
Микроконтроллеры имеют несколько видов памяти, но двумя основными являются флэш-память и ОЗУ.
Flash сохраняет вашу программу. Инструкции, которые вы ввели в Arduino IDE, переведены на язык, понятный микро. Флэш-память является энергонезависимой, т. е. сохраняется в течение всего цикла питания. Arduino Uno вмещает около 16 000 инструкций. Достаточно для довольно сложной программы.
Оперативная память, с другой стороны, хранит данные, которые использует ваша программа. Динамические вещи, такие как переменные, структуры, стек и т. д., помещаются в оперативную память. Это энергозависимая память, поэтому при каждом сбросе микроконтроллера ОЗУ очищается и заполняется заново. Arduino Uno имеет 2048 байт оперативной памяти. Это немного, ваш ноутбук может иметь более 4 миллиардов байт оперативной памяти! Так что его довольно легко запустить на Arduino. И вы не можете просто вставить другую карту памяти или вставить карту памяти USB.
3 метода сокращения использования оперативной памяти
Доступная оперативная память обычно значительно меньше флэш-памяти, что делает ее ценным ресурсом для вашего проекта Arduino. Необходимо позаботиться о том, чтобы свести к минимуму его использование, чтобы вы могли максимизировать функциональность своего творения.
Можно использовать всю доступную флэш-память.
Недопустимо использовать всю оперативную память. Вашей программе требуется некоторое рабочее пространство для отслеживания вызовов функций и локальных переменных (это называется стеком). Если вы используете динамическую память, часть оперативной памяти также будет использоваться кучей.
Среда Arduino IDE помогает, оценивая требуемый статический объем оперативной памяти (переменные и т. д.), но не может знать, как стек и куча повлияют на ситуацию. Например, какая переменная появится и исчезнет и когда. Если эти динамические переменные заполнят память и начнут перезаписывать стек, то программа рухнет. Сбои, возникающие из-за повреждения памяти, часто непредсказуемы и их трудно воспроизвести.
Как правило, старайтесь, чтобы использование ОЗУ, сообщаемое Arduino IDE, не превышало 60 % доступного объема ОЗУ.
Удалите неиспользуемые переменные и проверьте свои типы
Иногда, когда вы увлечены программированием, вы пробуете так много вещей, что возникают случайные переменные. Это переменные, которые объявлены, но больше не используются. Если это более крупные объекты, содержащие структуры и массивы, они могут потреблять значительное количество оперативной памяти. Самый простой способ найти мошеннические переменные — это закомментировать их и посмотреть, не жалуется ли компилятор. Если это так, просто снимите комментарий, поскольку вы, очевидно, все еще используете его где-то еще в программе.
Также стоит проверить типы остальных переменных. Подходят ли они для поставленной задачи? Использование правильных типов может сэкономить вам несколько байтов здесь или там. Например, если вы создавали счетчик, который увеличивается до 100, а затем снова сбрасывается до 0, вам явно не нужно целое число без знака, способное считать до 65 535. Байт (или uint8_t) гораздо более подходит, поскольку он использует на 1 байт меньше оперативной памяти и легко покрывает целевой диапазон. В таблице ниже указано количество байтов, потребляемых каждым типом данных на Arduino Uno.
В Arduino доступны три вида памяти: флэш-память, RAM и EEPROM.
Флэш-память используется для хранения программы. Он сохраняется даже при отключении питания Arduino или при перезагрузке.
Все данные и переменные, используемые во время выполнения, хранятся в оперативной памяти. Однако оперативная память — это энергозависимая память, которая стирается при каждой перезагрузке или отключении питания.
Для хранения данных, которые сохраняются при сбросе, Arduino предоставляет EEPROM.
Что такое EEPROM?
EEPROM означает электрически стираемое программируемое постоянное запоминающее устройство. Его можно представить как жесткий диск компьютера. Однако время чтения/записи намного быстрее в случае EEPROM.
Данные в EEPROM можно записывать, перезаписывать или стирать. Но это должен сделать явно пользователь. Вы можете использовать библиотеку EEPROM Arduino для доступа к API, которые сделают эту работу за вас.
EEPROM обычно используются для хранения настроек, которые необходимо вызвать после перезагрузки или включения Arduino. Предположим, Arduino нужно запомнить последнее известное состояние лампы, что она включается и выключается, и восстанавливать это состояние при восстановлении питания. В таком случае последнее известное состояние может быть записано в EEPROM, которое может быть считано после перезагрузки Arduino.
Сколько байт вы можете хранить?
Общий размер EEPROM зависит от модели Arduino, которую вы используете. Arduino Mega имеет самую большую память 4096 байт, за ней следуют Uno, Nano и Mini с 1024 байтами каждая.Некоторые платы Arduino, такие как определенные версии Nano и Mini, имеющие на борту контроллер Atmega168, имеют только EEPROM размером 512 байт. Платы Arduino также позволяют подключать внешние EEPROM для увеличения емкости памяти.
Конечно, срок службы EEPROM ограничен. Следовательно, вы можете стирать и перезаписывать данные только определенное количество раз. Обычно EEPROM в Arduino выдерживает около 100 000 циклов записи/стирания. К счастью, операции чтения EEPROM не влияют на его долговечность.
Как очистить память Arduino
Способ 1
<р>1. USB-кабель должен быть отключенПрежде чем начать процесс, первым шагом должно быть отсоединение USB-кабеля от Arduino. Это отключит питание, а также освободит контакты RX и TX, которые используются для связи USB-Serial.
<р>2. Подключите контакт RX к землеСледующим шагом должно быть подключение контакта RX к земле. Хотя вы можете сделать это, подключив перемычку между контактами RX и GND, использование резистора 10 кОм позволит ограничить ток между двумя контактами до безопасного значения.
<р>3. USB-кабель должен быть подключенПосле того, как вы отсоединили контакт RX, включите питание Arduino, снова подключив к нему USB-кабель.
<р>4. Загрузить новую программуОткройте Arduino IDE и загрузите любой базовый скетч в Arduino. Вы можете загрузить скетч "Blink" или скетч "Bare Minimum", чтобы упростить задачу.
<р>5. Отсоедините кабельЗатем снова отключите питание Arduino, отсоединив USB-кабель. Это сделано для того, чтобы безопасно удалить RX pull-down, не вызывая случайных коротких замыканий.
<р>6. Снимите заземление RXПосле того, как вы отсоединили USB-кабель, удалите резистор или провод, который вы подключили между контактом RX и контактом заземления.
<р>7. Убедитесь, что Arduino подключен напрямую к компьютеру, а не через концентраторЕсли этот метод у вас не работает, то вам следует проверить, как Arduino подключен к USB-порту вашего компьютера. Если он подключен через USB-концентратор, то все может не работать. Лучше всего подключить его напрямую к USB-порту вашего ПК.
Метод 2
Если вам неудобно подключать контакт RX к контакту GND, вы можете использовать метод, описанный ниже.
<р>1. Отсоедините USB-кабельЭтот метод также предполагает сначала отсоединение USB-кабеля. Это связано с тем, что последующие шаги потребуют от вас изменения настроек порта USB, к которому будет подключена ваша Arduino.
<р>2. Выберите Диспетчер устройствОткройте Диспетчер устройств из окна «Управление» в раскрывающемся меню, которое появляется, когда вы щелкаете правой кнопкой мыши «Этот компьютер».
<р>3. Выберите порты (COM и LPT)Порт Arduino обычно указан в разделе COM и LPT в списке устройств. Выберите «COM и LPT» из списка.
<р>4. Щелкните правой кнопкой мыши на плате Arduino (COMx)Среди всех подключенных COM-портов вы должны знать, какой номер COM-порта соответствует Arduino.
<р>5. Затем выберите «Свойства — Настройки порта — Переключить управление потоком на оборудование»Теперь вам нужно изменить настройки COM-порта, соответствующего вашему Arduino. Для этого выберите «Свойства» в появившемся раскрывающемся меню. Нажмите «Настройки порта», а затем измените «Управление потоком» на «Аппаратное».
<р>6. Создайте пустой скетч (пример ниже)В этом методе вы также можете использовать скетч «Bare Minimum» для прошивки на Arduino. Загрузите скетч в Arduino IDE.
<р>7. Снова подключите USB-кабельСнова подключите USB-кабель к Arduino, чтобы снова включить его.
<р>8. Загрузить, нажав Ctrl + UЗагрузите скетч «Базовый минимум». Вы также можете сделать это, нажав Ctrl+U на клавиатуре, не заходя в меню панели инструментов.
Вот пример пустого эскиза, который вы можете использовать
// Пустой скетч
аннулировать установку()
// Процедура цикла повторяется снова и снова:
Пустой цикл()
задержка(1000);
Заключение
Если вы отложите Arduino на пару недель, вы можете забыть, какой скетч был загружен в него последним. В таком случае, если вы включите его, который подключен к цепи, это может привести к повреждению вашего Arduino или связанной с ним схемы.
Поэтому всегда стирайте и загружайте в него пустой эскиз, прежде чем использовать его в другой схеме.
У Arduino есть три вида памяти: RAM, Flash и EEPROM.
При перезагрузке Arduino содержимое ОЗУ удаляется. Используются переменные и регистры, а также указатель команд.
Флэш-память используется для хранения кода. Всякий раз, когда Arduino сбрасывается или выключается, эта информация не теряется.
Вам следует хранить данные в EEPROM, если вы не хотите, чтобы они были удалены. Вы не можете просто назначить переменную в EEPROM; вы должны сделать это напрямую. Это удобно для хранения данных конфигурации, которые не меняются часто, но которые вы не хотите менять каждый раз при включении или сбросе Arduino.
Создание данных внутри скетча занимает только то время, пока Arduino включен, когда вы идентифицируете и используете переменную. Данные, содержащиеся в Arduino, теряются независимо от того, сбрасывается ли он или выключается.
Оглавление
Что такое EEPROM?
Каждая плата Arduino имеет отдельную память в микроконтроллере. Она называется электрически стираемой программируемой постоянной памятью (также известной как EEPROM).
В этом крошечном пространстве памяти могут храниться байтовые переменные. При сбросе или выключении Arduino переменные, содержащиеся в EEPROM, остаются там. Проще говоря, EEPROM — это форма постоянного хранилища, которая работает аналогично жесткому диску в устройстве.
В электронном виде EEPROM можно интерпретировать, удалять и перезаписывать. Используя библиотеку EEPROM в Arduino, вы можете быстро читать и записывать из EEPROM.
Сколько байтов вы можете хранить?
Количество байтов, которые вы можете хранить в EEPROM, определяется микроконтроллером Arduino:
Микроконтроллер Arduino | Размер EEPROM |
ATmega2560 (Arduino Mega) | 4096 байт |
ATmega328 (есть в Arduino Uno, Nano, Mini) | 1024 байта |
ATmega168 (Arduino Nano) | 512 байт |
Вы можете получить дополнительную (внешнюю) EEPROM, если вам нужно хранить больше данных.
Срок службы EEPROM ограничен. EEPROM в Arduino настроен на управление 100 000 циклов записи/стирания на место. Чтения, с другой стороны, безграничны. Это гарантирует, что вы сможете считывать данные из EEPROM столько раз, сколько захотите, не ставя под угрозу его долговечность.
EEPROM полезен в проектах Arduino, в которых требуется сохранение данных даже после сброса Arduino или отключения питания.
Это особенно полезно для вызова последнего состояния переменной или количества включений устройства.
Например, вы можете использовать эту функцию в таком сценарии:
- Вы используете Arduino для управления лампой, и лампа включена;
- Ардуино случайно теряет питание;
- При восстановлении питания лампа остается выключенной — она не запоминает свою предыдущую настройку.
- Это то, чего вы не хотите. Вам может понадобиться, чтобы Arduino вспомнил, что произошло до того, как он потерял питание, и вернулся в прежнее состояние;
Чтобы решить эту дилемму, сохраните состояние лампы в EEPROM и укажите в своем эскизе условие, которое проверяет, соответствует ли текущее состояние лампы состоянию, сохраненному в памяти EEPROM.
Как очистить память Arduino/стереть EEPROM с помощью кодирования:
- Вам нужно найти базовую пустую программу установки (иногда ее называют циклом);
- Затем его нужно скомпилировать;
- Сбросьте плату Arduino. Нажмите аппаратную кнопку (обычно расположенную на чипе);
- Затем нужно нажать комбинацию клавиш Ctrl+U. Это загрузит код;
- Если ничего не происходит, повторите предыдущий шаг еще раз;
Перед тем, как загрузчик запустит программу, ожидается задержка; просто подождите. Это может справиться с потенциальными ошибками в коде Arduino при выполнении программного сброса каждые 500 мс.
Как сбросить/очистить память платы Arduino Leonardo?
Вот простой алгоритм действий:
- Кабель USB должен быть отключен;
- Подключите контакт RX к земле;
- Кабель USB должен быть подключен.
- Загрузить новую программу;
- Отсоедините кабель;
- Удалите заземление RX;
Убедитесь, что Arduino подключен напрямую к компьютеру, а не к концентратору.
Еще одно простое решение, которое может сработать:
- Отсоедините USB-кабель;
- Выберите Диспетчер устройств.
- Выберите порты (COM и LPT)
- Нажмите правую кнопку мыши на плате Arduino (COMx);
- Затем выберите "Свойства – Настройки порта – Установить управление потоком на оборудование";
- Создайте пустой эскиз (пример ниже);
- Снова подключите USB-кабель;
- Загрузить, нажав Ctrl + U;
Вот пример пустого эскиза, который вы можете использовать:
// Пустой скетч
// Процедура цикла повторяется снова и снова:
При включении Arduino запускается последняя установленная на нем программа. Если вы не хотите, чтобы он выключался, не включайте его.
Обычно Arduino запускает программу Blink прямо из упаковки. Если вы хотите «сбросить» его, вы можете просто загрузить его, и все готово.
В качестве альтернативы вы можете использовать циклическую программу с кнопкой перехода в спящий режим.
Однако, если вы возились с загрузчиком USB через контакты, вам придется перезагрузить загрузчик. Если вы загружали программы через USB или напрямую использовали компилятор, загрузка Blink или другой фиктивной программы для сброса не должна вызвать проблем.
Как сбросить или очистить память платы Arduino Uno?
Если вы когда-либо работали с платой Arduino, вы, вероятно, сталкивались с контактом RESET и задавались вопросом, каково его назначение. Так что эта булавка пригодится.
Кроме того, вы могли обнаружить, что при загрузке кода на плату Arduino он сбрасывается.
Еще один способ сбросить настройки Arduino — открыть последовательный терминал в программе Arduino при подключении платы Arduino к устройству. Arduino немедленно сбрасывается при запуске последовательного терминала.
Кнопка — это третий способ сброса настроек Arduino. Arduino перезагрузится, когда вы нажмете и отпустите кнопку.
Чтобы «сбросить» Arduino, выполните следующие действия. Выключите его, зажмите Reset, а затем снова включите, все еще удерживая кнопку. Из-за этого исходный эскиз больше не может работать. После этого вам нужно будет создать новый эскиз.
Видео по теме: Как очистить EEPROM в Arduino
Как удалить любой скетч с любой платы Arduino?
Рассмотрите возможность загрузки эскиза во флэш-память, как если бы вы записывали файл ОС на SD-карту Raspberry Pi. Этот скетч будет загружаться каждый раз, когда вы подключаете питание. Однако с микроконтроллером он загружается почти мгновенно.
Поскольку микросхема Arduino запрограммирована на прошивку с помощью программы, она может оставаться на микросхеме до повторной прошивки, независимо от того, была ли она выключена или включена.
Если вы хотите настроить плату Arduino для работы с новой схемой, подумайте о том, чтобы сначала загрузить программу Blink, потому что это самый простой и быстрый способ «перезагрузиться» в общую начальную точку.
Я загрузил скетч в Arduino Uno, цикл которого выглядит примерно так:
Итак, теперь я больше не могу ничего загружать, потому что в IDE написано "порт уже используется".
Есть ли способ «сбросить» Arduino без другого программатора?
Ничто больше не использует последовательный порт, и все шло нормально, пока я не загрузил предыдущий скетч.
Я нашел несколько интересных вещей:
Открыто ли окно «Последовательный монитор» Ardunio? Если это так, это заблокирует ваше общение с доской.
21 Ответ 21
Попробуйте следующее:
- Подготовьте базовую пустую программу (пустая установка, цикл и т. д.)
- Скомпилируйте его.
- Сбросьте настройки Arduino с помощью аппаратной кнопки на микросхеме.
- Нажмите Ctrl + U, чтобы загрузить код.
- В случае неудачи — до 3.
Существует задержка перед запуском программ загрузчиком, просто поработайте над временем. Это сработало для меня, когда ошибка в моем коде Arduino выполняла программный сброс каждые 500 мс.
У меня ушло 2 часа, но наконец-то это сработало. Что сработало для меня, так это: (1) Удерживайте нажатой кнопку сброса. (2) Нажмите Ctrl + U, чтобы загрузить мой код. (3) Подождите, пока не появится сообщение о загрузке. (4) Отпустите кнопку сброса , а затем снова быстро нажмите и отпустите ее.
У меня была такая же проблема на двух платах Arduino (одной Uno и одной плате Modern Device Freeduino/USB Host), и окно между перезагрузкой и началом использования последовательного порта было настолько маленьким, что было невозможно загрузить данные.
Я, наконец, решил проблему, купив еще один Arduino Uno и соорудив кабель ISP в соответствии с этими инструкциями, и используя его для прошивки приложения Bare Bones из примеров на каждую недоступную плату, используя Arduino IDE версии 0023, следуя этим инструкциям, чтобы изменить предпочтения.txt. (Обязательно сохраните исходный файл перед его редактированием, чтобы вы могли заменить его после восстановления Arduino.)
Чтобы исправить каждую доску, потребовалась одна быстрая загрузка. Такое быстрое исправление после стольких страданий. Возможно, вам не захочется покупать еще один Arduino, но учтите следующие преимущества:
- Вы можете перезаписать загрузчик на Arduino, чтобы освободить место.
- После перезаписи загрузчика плата будет загружаться быстрее.
- Предполагается, что вы можете запрограммировать необработанные AVR для специальных проектов, но я не пробовал: Google for ArduinoISP
- Это быстро исправит Arduino, которые вы заблокируете в будущем.
- Теперь вы можете безопасно поэкспериментировать, чтобы найти способы предотвратить блокировку устройства при использовании последовательного порта в будущем.
- Отключите USB-кабель.
- Подключите контакт RX к земле.
- Подключите USB-кабель.
- Загрузить новую программу
- Отсоедините USB-кабель.
- Удалите заземление RX.
Спасибо за ваше решение, у меня оно сработало на Mega 2560, но я подключаю контакт RX к GND с помощью резистора 10 кОм, который является более безопасным методом понижения напряжения
Убедитесь, что вы подключаете Arduino напрямую к компьютеру, а не через концентратор. Эта ошибка будет вызвана использованием концентратора.
Это была именно моя проблема. Я использовал USB-концентратор, встроенный в мой монитор. Так что, по крайней мере, иногда это проблема.
Я думаю, это зависит. Иногда это нормально с USB-концентратором. Возможно, предыдущие USB-устройства нужно очистить в диспетчере устройств (если в Windows)? Чтобы отобразить эти старые устройства, необходимо вызвать пункт меню.
После того, как я почесал голову над этой проблемой, вот очень простое решение, которое работает в любое время:
- Отключите USB-кабель.
- Зайдите в Диспетчер устройств
- Нажмите Порты (COM и LPT)
- Щелкните правой кнопкой мыши на Arduino. (COMx)
- Свойства
- Настройки порта
- Перенесите управление потоком на HARDWARE
- Создайте пустой эскиз (Необязательно)
- Подключите USB-кабель.
- Загрузить ( Ctrl + U )
На этот раз я был очень взволнован, возможно, это сработает, но это не сработало. Однако спасибо за другое решение.
Вот что я сделал в Linux, чтобы иметь возможность запрограммировать мой Arduino Micro, который застрял в цикле отправки ключа 0 при подключении через USB;
Ваш вывод может немного отличаться, поэтому просто попробуйте запустить;
затем подключите Arduino и посмотрите, как отформатирован вывод.
Это остановило X от приема нажатий клавиш и позволило Arduino IDE наконец запрограммировать!
Основываясь на своем опыте связи, которая уже используется или заблокирована, я бы сказал, что программа, с которой вы взаимодействуете, все еще имеет связь.
Я также обнаружил, что если вы отсоедините USB-кабель, связь прервется. Это не лучшее решение, но оно решает проблему.
Для пользователей Arduino Yun: попробуйте выполнить загрузку через Ethernet/Wi-Fi (меню Инструменты → Порт).
У меня была точно такая же проблема, и я перепробовал почти все (кроме записи нового загрузчика). Я удивлен, что это сработало, но я без проблем загрузил пустой скетч.
Я потратил последние пять часов на поиск решения этой проблемы (последовательный порт COM3 уже используется, а последовательный порт неактивен). Я перепробовал все возможные форумы и сайты вопросов и ответов, включая этот.
Что, наконец, исправило это (избавился от последнего введенного кода, который зависал, и загрузил простую функцию мерцания)?
Перейдите по этой ссылке -- http://arduino.cc/en/guide/windows и следуйте инструкциям по установке драйверов. Мой драйвер был «уже обновлен», но после этих шагов проблема была устранена. Теперь я снова счастлив в кемпинге.
Примечание: сброс платы вручную с помощью кнопки на чипе или в цифровом виде с помощью различных кодов в Интернете не помог решить эту проблему, потому что сигнал был каким-то образом заблокирован/перепутан между моим Arduino Uno и портом в моем ноутбуке. . Обновление драйверов похоже на сброс для проблемы «последовательный порт уже используется».
Читайте также: