Есть ли способ загрузить эскиз из Arduino?
Я сделал эскиз, но потом я его потерял. Тем не менее, я загрузил его в Arduino, прежде чем потерять его. Есть ли способ вернуть его?
5 ответов
Это должно быть возможно, если бит безопасности не установлен. Этот вопрос был задан на EE некоторое время назад.
Возможно ли извлечь код из плата arduino?
Но вы не получите код Arduino, который вы написали. Код скомпилирован в сборку, и вам придется преобразовать его обратно в C самостоятельно.
Этот ответ напрямую не отвечает на вопрос, но все равно приведет к такому же результату.
В Arduino IDE используются временные каталоги для хранения файлов сборки, включая исходный эскиз, а также HEX и промежуточные файлы.
На Mac они по умолчанию находятся в /var /folders, а на компьютере с Windows они находятся в â € | \ Local Settings \ Temp \ (которые в зависимости от версии Windows могут быть в нескольких местах).
Я обнаружил, что особенно в Windows эти файлы сборки не удаляются при закрытии эскиза или IDE, поэтому они могут существовать на вашем компьютере намного дольше, чем вы думаете.
Кроме того, по умолчанию Crashplan, Backblaze и Time Machine резервируют эти местоположения, поэтому даже если они были удалены, они все равно могут находиться в резервной копии.
Преимущество здесь в том, что вы восстановите код C, а не ASM.
Вы можете загрузить шестнадцатеричный дамп файла, но нет простого способа получить весь код и комментарии на C ++. Если вы можете понять сборку, вы можете воссоздать программу, но это займет некоторое время. На некоторых устройствах имеются разборщики, я не знаю о arduino.
Я думаю, что есть еще один способ сделать это, не извлекая код с платы Arduino. Верните дату создания эскиза и найдите его в C: \ Users \ User \ AppData \ Local \ Temp \ (Например: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Вы можете найти свой несохраненный код, если он не был удален какой-либо «освобождающей космической программой». Удачи!
Если ваша цель - просто скопировать идентичный код на другое устройство, простой ответ: нет
Как было указано в других ответах, вы можете превратить шестнадцатеричный код на устройстве обратно в код ассемблера.
Например (как только вы скопировали код с устройства обратно на свой диск):
avr-objdump -j .sec1 -d -m avr5 yourFileHere.hex
Запуск в одном из файлов загрузчика я получаю эти результаты (частично):
00007e00 <.sec1 & gt ;:
7e00: 11 24 eor r1, r1
7e02: 84 b7 в r24, 0x34; 52
7e04: 14 вне 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 с 0x00C4, r24
7e28: 8e e0 ldi r24, 0x0E; 14
7e2a: c9 d0 rcall. + 402; 0x7fbe
7e2c: 259a sbi 0x04, 5; 4
Как вы можете видеть, не особенно полезно воспроизводить то, что сделал ваш эскиз. Вероятно, существует один из двух сценариев:
- Ваш эскиз был коротким, и в этом случае вы, после нескольких недель работы, вернете код ассемблера на C
- Ваш эскиз был длинным, и в этом случае было бы практически невозможно вернуть его в C
В случае с «коротким эскизом» вам лучше просто переписывать с нуля. Это было бы быстрее, почти наверняка. В случае «длинного эскиза» это просто не стоит. Ни одно из имен переменных не сохраняется и способ, которым компилятор оптимизирует код, даже структуру кода будет трудно определить.