Есть ли способ скачать скетч из Arduino?

44

Я сделал эскиз, но потом потерял его. Тем не менее, я загрузил его в Arduino, прежде чем потерять его. Можно ли как-нибудь вернуть его обратно?

Парень в шляпе
источник
5
electronics.stackexchange.com/questions/28211/… но, как говорят другие, это выплевывает только файлы .hex, а не исходный C-источник.
Джиппи
Межсайтовый обман: reverseengineering.stackexchange.com/q/125/189
asheeshr

Ответы:

35

Это должно быть возможно, пока бит безопасности не установлен. Этот вопрос был задан на EE некоторое время назад.

Можно ли извлечь код с платы Arduino?

Но вы не получите код Arduino, который вы написали обратно. Код скомпилирован в сборку, и вам придется преобразовать его обратно в C самостоятельно.

sachleen
источник
Чтение необработанных шестнадцатеричных данных: forum.arduino.cc/index.php?topic=6150.0 и автоматическая разборка: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar,
20

Этот ответ не дает прямого ответа на вопрос, но все равно приведет к тому же конечному результату.

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

На Mac они по умолчанию находятся в папках / var /, а на компьютере с Windows они находятся в ... \ Local Settings \ Temp \ (что в зависимости от версии Windows может находиться в нескольких местах).

Я обнаружил, что особенно в Windows эти файлы сборки не удаляются при закрытии эскиза или IDE, поэтому они могут существовать на вашем компьютере гораздо дольше, чем вы думаете.

Кроме того, по умолчанию Crashplan, Backblaze и Time Machine выполняют резервное копирование этих расположений, поэтому даже если они были удалены, они все равно могут находиться в резервной копии.

Преимущество здесь в том, что вы будете восстанавливать код C, а не ASM.

Cybergibbons
источник
3
Это лучшее решение ИМХО. Очень креативно тоже ...
dda
1
Вы можете найти это в /tmp/каталогах на Linux (и даже Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12
Эхо комментария от принятого ответа: чтение необработанного гексагона: forum.arduino.cc/index.php?topic=6150.0 и автоматическая разборка: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar
5

Вы можете скачать шестнадцатеричный дамп файла, но нет простого способа получить весь код C ++ и комментарии. Если вы понимаете сборку, вы можете пересоздать программу, но это займет некоторое время. Для некоторых устройств доступны дизассемблеры, я не знаю насчет arduino.

Доктор
источник
3
Для arduino нет дизассемблеров, потому что это не тип MCU. Там являются несколько ATMEGA дизассемблеров (Google atmega disassembler).
Коннор Вольф
Если у вас есть arduino envitonment, у вас уже есть avr-objdump, так как он поставляется с avr-gcc.
Крис Страттон
Чтение необработанных шестнадцатеричных данных: forum.arduino.cc/index.php?topic=6150.0 и автоматическая разборка: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar,
5

Я думаю, что есть другой способ сделать это, не извлекая код из платы Arduino. Поменяйте дату создания эскиза и найдите его в C: \ Users \ User \ AppData \ Local \ Temp \ (например: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Вы можете найти свой несохраненный код, если он не был удален какой-либо «программой освобождения места». Удачи!

Zathura
источник
4

Если ваша цель не состоит в том, чтобы просто скопировать идентичный код на другое устройство, простой ответ: нет

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

Например (когда вы скопировали код с устройства обратно на диск):

avr-objdump -j .sec1 -d -m avr5 yourFileHere.hex

Запустите на одном из файлов загрузчика я получаю эти результаты (частично):

00007e00 <.sec1>:
    7e00:       11 24           eor     r1, r1
    7e02:       84 b7           in      r24, 0x34       ; 52
    7e04:       14 be           out     0x34, r1        ; 52
    7e06:       81 ff           sbrs    r24, 1
    7e08:       f0 d0           rcall   .+480           ;  0x7fea
    7e0a:       85 e0           ldi     r24, 0x05       ; 5
    7e0c:       80 93 81 00     sts     0x0081, r24
    7e10:       82 e0           ldi     r24, 0x02       ; 2
    7e12:       80 93 c0 00     sts     0x00C0, r24
    7e16:       88 e1           ldi     r24, 0x18       ; 24
    7e18:       80 93 c1 00     sts     0x00C1, r24
    7e1c:       86 e0           ldi     r24, 0x06       ; 6
    7e1e:       80 93 c2 00     sts     0x00C2, r24
    7e22:       80 e1           ldi     r24, 0x10       ; 16
    7e24:       80 93 c4 00     sts     0x00C4, r24
    7e28:       8e e0           ldi     r24, 0x0E       ; 14
    7e2a:       c9 d0           rcall   .+402           ;  0x7fbe
    7e2c:       25 9a           sbi     0x04, 5 ; 4

Как видите, не особенно полезно для воспроизведения того, что сделал ваш эскиз. Вероятно, будет один из двух сценариев:

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

В случае с «коротким наброском» лучше переписать с нуля. Это было бы быстрее, почти наверняка. В случае "длинного наброска" - это просто не стоит. Ни одно из имен переменных не сохраняется, и то, как компилятор оптимизирует код, даже структуру кода будет трудно определить.

Ник Гаммон
источник