Тройное нажатие кнопки "Сброс", чтобы удалить существующую программу

bootloader programming-sequence

У Arduino есть два варианта сброса, о которых я знаю:

  • одним щелчком мыши перезапускает существующую программу
  • дважды щелкните, чтобы прослушать загрузку в течение нескольких секунд, а затем перезапустите существующую программу

Есть ли другой вариант, чтобы существующая программа была стерта или заменена чем-то мягким, например мигалкой, например

  • тройным щелчком мыши удаляет существующую программу и бесконечно прослушивает загрузку

Если нет, то каков уровень сложности изменения стандартного загрузчика для реализации этой опции?

ПРИМЕЧАНИЕ

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

, 👍1

Обсуждение

Разве загрузчик не является открытым исходным кодом? Ты его искал?, @the busybee

Какой Ардуино? Один щелчок чего именно?, @Nick Gammon

@NickGammon *Трижды нажмите сброс* в заголовке настоятельно рекомендуется нажать кнопку сброса. Ардуино с возможностью загрузки встроенного ПО USB., @Paul Jurczak

Вы все еще не ответили на вопрос "какой Arduino?" Это секрет? В любом Arduino кнопка сброса сбрасывает его, нет такой вещи, как сброс двойным щелчком. И уж точно не тройной щелчок. Сброс вызывает схему сброса, которая заставляет процессор выполнить свой код сброса, очистив все регистры и запустив код с самого начала., @Nick Gammon

@NickGammon Не секрет. Я использую клоны Нуля, но я ищу что-то применимое не только к одной модели. *нет такой вещи, как сброс двойным щелчком*-загрузчик на моей плате реагирует на двойной щелчок по кнопке сброса по - разному, возможно, сохраняя состояние в памяти NV., @Paul Jurczak

как должно помочь удаление старого скетча? двойной сброс-это способ поместить "замурованный" ноль в режим загрузчика и загрузить скетч. он остается в этом режиме. это не тайм-аут., @Juraj

@Juraj *он остается в этом режиме. это не тайм-аут.* Мой тайм-аут истекал через несколько секунд. Я использовал перо Adafruit M0., @Paul Jurczak

M0 не равно нулю. Время ожидания загрузчика M0 истекло. вы можете заменить загрузчик на нулевой загрузчик, если у вас есть программатор SWD, @Juraj

*Я использовал перо Adafruit M0* - вы могли бы упомянуть об этом **в начале**., @Nick Gammon

В следующий раз поместите эту информацию **в вопрос**. Вот где ему самое место., @Nick Gammon


3 ответа


-2

Я бы сказал, что вероятность того, что кто-то скопирует программу, невелика. Почему бы не выбрать простой выход и не установить некоторые биты в EEPROM, когда вы проверяете набор с тройным щелчком мыши или очищаете биты по вашему выбору, а затем при загрузке проверяете биты и принимаете решение моргнуть или сделать свое дело. Простой и недорогой, без дополнительных деталей.

,

Речь идет не о защите от копирования. Это метод восстановления закирпиченной платы., @Paul Jurczak


1

Теперь, когда мы знаем тип платы (Ноль), для получения которого потребовалось несколько вопросов, можно дать разумный ответ. Если бы это был Uno, я бы сказал, что нет, он этого не делает, и для его реализации потребуется слишком много места в программе.

Есть ли другой вариант удалить существующую программу или заменить ее чем-то мягким?..

Нет, насколько мне известно, нет, если только в документации к Нулю не указано иное.

Если нет, то каков уровень сложности изменения стандартного загрузчика для реализации этой опции?

Умеренный, я бы предположил.

Что касается нуля, с 256 КБ программируемой памяти его, вероятно, можно было бы реализовать, изменив загрузчик. Любое такое изменение, конечно, уменьшит объем памяти, доступной для других задач, но, возможно, это не так важно, если вы начнете с 256 КБ.

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

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

Есть несколько альтернатив, которые вы могли бы рассмотреть:

  • Если у вас есть запасной вывод в вашем проекте, сделайте так, чтобы, если (скажем) вывод 13 заземлен при запуске, ничего не делать (кроме как войти в замкнутый контур). Это можно было бы сделать до того, как что-либо может затруднить перепрограммирование, например переход в режим низкой мощности.

  • Перепрограммируйте его с помощью SWD-программирования (а не загрузчика). Я не знаю точных деталей для нуля, так как у меня его нет, но должен быть способ, иначе вы не смогли бы установить на него загрузчик в первую очередь. Судя по тому, что я читал в других местах, Atmel ICE-это устройство, которое вам нужно перепрограммировать таким образом.

  • Судя по тому, что я прочитал здесь, вы можете получить доступ к загрузчику, выбрав Arduino Zero (порт программирования) в качестве платы, а Atmel-EDBG в качестве программатора. Затем вы могли бы попросить Atmel-EDBG перепрограммировать плату. Мои подробности здесь туманны, но вы могли бы рассмотреть это как вариант.

,

Мне нравится идея использовать для этой цели дополнительный контакт. Двойной щелчок работает большую часть времени, но вам нужно синхронизировать нажатия клавиш и сбросить настройки., @Paul Jurczak


1

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

Исходный код загрузчика Arduino M0 находится в пакете поддержки плат Arduino SAMD. Adafruit может использовать модифицированную версию. Загрузчик странный, потому что avrdude используется для загрузки через этот загрузчик, и плата сообщает в avrdude как ATmega.

Загрузчик M0 (и загрузчик ATmega 32u4 для Leonardo и Micro) имеют тайм-аут после двойного сброса. Если загрузка не происходит через несколько секунд после двойного сброса, они запускают скетч.

Вы хотите добавить тройной сброс, чтобы заменить скетч, который не отвечает, сохраненным скетчем, который будет обрабатывать USB и разрешать загрузку в любое время. Для этого потребуется изменить источник загрузчика, построить загрузчик и использовать программатор SWD для его записи (или создать скетч, который заменит загрузчик).

Лучший вариант-это то, что Arduino сделал для загрузчика Zero и MKR. Загрузчик, активированный с двойным сбросом, не отключается с помощью этого загрузчика, и загрузка возможна в любое время после двойного сброса (до следующего сброса или цикла питания).

Исходные M0 и Ноль-это почти одна и та же плата. Один из них был продан arduino.org другим путем arduino.cc. Самое важное отличие-это загрузчик.

Можно использовать плату M0 в качестве нуля с нулевым загрузчиком. Заменив загрузчик, вы получите двойной сброс без тайм - аута. Другими преимуществами являются более быстрая загрузка с bossac, загрузчик вдвое меньше загрузчика M0, а нулевой загрузчик не сбрасывает внутренний RTC, как это делает загрузчик M0.

,