Могу ли я повредить Arduino, если отключить от сети во время загрузки?

Когда я возился с кодом и загружал скетч на плату Arduino, я почти случайно вытащил USB-шнур. Все хорошо, но потом я начал думать, что было бы, если бы я вытащил его.

Насколько безопасен avrdude? Может ли это повредить или испортить плату? Я бы предположил, что вам просто нужно будет снова загрузить в него код... но что произойдет до того, как вы загрузите новый код? Я видел кое-что о том, как вы всегда можете загрузить новый код, если загрузчик не поврежден, но я бы предположил, что возникнут некоторые проблемы. Если бы это произошло, должен ли я отключить все подключенное на случай, если Arduino запишет ВЫСОКИЙ уровень на вход (или аналогичный), который может повредить компонент?

, 👍5

Обсуждение

Итак, я случайно сделал это с моим Arduino Nano 33 BLE, и теперь мой компьютер не может его видеть.. Я попробовал перезагрузить компьютер, нажать кнопку сброса на плате, отсоединить и снова подключить его, но по-прежнему ничего. Есть ли способ оживить его?, @Coy

@Coy, используй двойной сброс, чтобы активировать загрузчик, @Juraj


3 ответа


Лучший ответ:

7

AVRDUDE на самом деле не выполняет запись, он просто направляет ее. Фактические записи выполняются либо загрузчиком, либо прошивкой / оборудованием ISP внутри самого MCU.

С загрузчиком это зависит от того, как он закодирован, но в худшем случае он завершит работу с байтом flash или страницей или страницей EEPROM, заполненной нулем или единицей, а затем не сможет продолжить общение с AVRDUDE, прерывая программирование.

При использовании ISP команда записи страницы никогда не будет получена, и программирование будет прервано на последней полной странице. Байты предохранителя выполняются поодиночке, и поэтому программирование одного предохранителя можно рассматривать как атомарную операцию.

В любом случае операция стирания микросхемы должна привести MCU в известное рабочее состояние, за исключением замены предохранителя.

,

* С загрузчиком это зависит от того, как он закодирован, но в худшем случае он завершит работу с байтом flash или страницей или страницей EEPROM, заполненной нулем или единицей, а затем не сможет поддерживать дальнейшую связь с AVRDUDE, прерывая программирование.* Подожди... как он может прервать его, если нет питания?, @Anonymous Penguin

@AnnonomusPerson: Внешнее питание, USB / последовательное программирование., @Ignacio Vazquez-Abrams

Что делать, если я использую только USB-питание? Это не отвечает на мой вопрос о вашем ответе., @Anonymous Penguin

Если все, что у вас есть, это питание от USB, то все просто останавливается. Загрузчик не может завершить текущий байт. Но это не повредит ни одной флэш-памяти., @Ignacio Vazquez-Abrams


1

Все должно быть хорошо.

Большинство плат не требуют повторной загрузки загрузчика каждый раз, когда вы загружаете скетч, поэтому ваша программа будет повреждена, а загрузчик - нет. Я предполагаю, что загрузчик похож на загрузчик на других чипах, которые я видел*, он остановит выполнение, если код не будет работать должным образом. Я бы также подумал, что micro не примет передачу, если ее контрольная сумма отсутствует.

На вашем месте я бы не стал этого делать, но вы могли бы быть немного менее осторожны в подобных вещах.

*: чип пропеллера, среди прочего

,

Очень немногие встроенные микроконтроллеры имеют какие-либо средства улавливания ошибок. Если под код не работает должным образом вы подразумеваете, что код в памяти программы недействителен / поврежден, вы ошибаетесь. MCU просто с радостью продолжит выполнение недопустимого кода, что приведет к неопределенному поведению. Если вы имеете в виду, что загрузчик будет игнорировать недопустимые команды, это полностью зависит от загрузчика., @Connor Wolf

Да, ничего не нужно ловить или проверять на наличие ошибок в пользовательском коде в Optiboot. Для этого и предназначен сторожевой таймер., @Cybergibbons


2

Одна из функций безопасности, которая до сих пор не упоминалась, заключается в том, что ATmega328 имеет набор битов блокировки, которые препятствуют доступу на чтение / запись к определенным областям. Насколько мне известно, при настройке ардуино эти биты всегда настроены на предотвращение записи в область загрузчика, если в данный момент не активна команда "Записать загрузчик", и поскольку вы можете использовать эту команду только с внешним программатором, вы всегда можете написать новый загрузчик, если что-то все идет не так.

Я думаю, что единственный способ замуровать плату (в смысле оставить микроконтроллер в работоспособном, но почти безвозвратно невосприимчивом состоянии) - это записать неправильные настройки предохранителей.

,