Есть ли какой-нибудь способ загрузить скетч с ардуино?

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

, 👍61

Обсуждение

http://electronics.stackexchange.com/questions/28211/backup-avr-with-avrdude но, как говорят другие, это выплевывает только шестнадцатеричные файлы, а не исходный источник Си., @jippie

Кросс сайт dupe: http://reverseengineering.stackexchange.com/q/125/189, @asheeshr


7 ответов


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

43

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

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

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

,

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


6

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

,

Для arduino нет дизассемблеров, потому что он не относится к типу MCU. Существует **** несколько **дизассемблеров ATmega** (google "дизассемблер atmega")., @Connor Wolf

Если у вас есть среда arduino, у вас уже есть avr-objdump, так как он поставляется с avr-gcc., @Chris Stratton

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


26

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

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

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

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

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

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

,

Это лучшее решение ИМХО. И очень креативный..., @dda

Вы можете найти это в каталогах "/tmp/ " в Linux (и даже Mac). c.f. https://www.arduino.cc/en/Hacking/BuildProcess, @pd12

Эхо комментария из принятого ответа: Повторное чтение необработанного шестнадцатеричного кода: http://forum.arduino.cc/index.php?topic=6150.0 и Автоматическая Разборка: http://forum.arduino.cc/index.php/topic,46843.0.html, @SDsolar

Я предполагал, что ты проверил мусор. Я использую Linux mint, и моя последняя программа была здесь: "/tmp/arduino_build_699749/preproc/ctags_target_for_gcc_minus_e.cpp" Это был исходный файл, который я собрал несколько дней назад. Обратите внимание, что с тех пор я ничего не компилировал. Я нашел оригинал /tmp/arduino_build_699749/sketch/myfile.ino.ccp. Это, вероятно, не поможет вам, но, вероятно, поможет другим. Помните, что идите за ним, прежде чем компилировать что-либо еще., @Gil


6

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

,

6

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

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

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

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

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

,

3

Скачать: avrdude -c -P -b -p m328p -U flash:r:SaveFlash.hex:i

Загрузка: avrdude -c -P -b -p m328p -U flash:w:SaveFlash.hex:i

Скачать с помощью загрузчика uno: avrdude -carduino -P -b115200 -p m328p -U flash:r:SaveFlash.hex:i

,

0

Другой подход может заключаться в том, чтобы рассматривать программу на борту Arduino как упражнение с черным ящиком. То есть запустите программу и внимательно следите за тем, что происходит (через последовательный монитор или что-то еще). Если на самом деле есть какие-либо результаты, которые вы можете наблюдать, поставьте задачу создать свой собственный новый код, чтобы имитировать то, что делает программа. Это не будет продуктивным, если исходный программист не включит в код инструкции Serial.print (), которые я НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ развивать в качестве привычки программирования. Это облегчает именно то упражнение, которое я предлагаю. (Спросите меня, почему я выработал эту привычку для всего, что я кодировал в течение последних 30 лет.)

К сожалению, большинство людей оставляют несколько комментариев здесь и там, что полезно 5 лет спустя, если у вас есть исходный код. Лично я комментирую КАЖДУЮ СТРОКУ исходного кода. Но комментарии в исходном коде не помогают в дальнейшем в подобной ситуации, так как компилятор не помещает их в машинный код, который он генерирует. (Возможно, это может быть ценным вариантом для компилятора. Да, для этого требуются байты, но насколько это может быть полезно спустя годы для важного проекта?)

Мои два цента стоят, что, вероятно, стоит той цены, которую заплатил читатель этого поста, чтобы увидеть это!

,