Есть ли какой-нибудь способ загрузить скетч с ардуино?
Я сделал скетч, но потом потерял его. Тем не менее, я загрузил его в Arduino, прежде чем потерять. Есть ли какой-нибудь способ вернуть его в программный код?
7 ответов
Лучший ответ:
Это должно быть возможно до тех пор, пока бит безопасности не установлен. Этот вопрос был задан на EE некоторое время назад.
Можно ли извлечь код с платы arduino?
Но вы не получите код Arduino, который вы написали в ответ. Код скомпилирован в сборку, и вам придется самостоятельно преобразовать его обратно в C.
Считывание исходного шестнадцатеричного кода: http://forum.arduino.cc/index.php?topic=6150.0 и Автоматическая Разборка: http://forum.arduino.cc/index.php/topic,46843.0.html, @SDsolar
Вы можете загрузить шестнадцатеричный дамп файла, но нет простого способа получить весь код и комментарии на 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
Этот ответ не дает прямого ответа на вопрос, но все равно приведет к тому же конечному результату.
Среда 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
Я думаю, что есть другой способ сделать это, не извлекая код с платы 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>:
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
В случае "короткого скетча" вам лучше просто переписать с нуля. Это было бы быстрее, почти наверняка. В случае с "длинным скетчем" - это просто того не стоит. Ни одно из имен переменных не сохраняется, и то, как компилятор оптимизирует код, даже структуру кода было бы трудно определить.
Скачать: 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
Другой подход может заключаться в том, чтобы рассматривать программу на борту Arduino как упражнение с черным ящиком. То есть запустите программу и внимательно следите за тем, что происходит (через последовательный монитор или что-то еще). Если на самом деле есть какие-либо результаты, которые вы можете наблюдать, поставьте задачу создать свой собственный новый код, чтобы имитировать то, что делает программа. Это не будет продуктивным, если исходный программист не включит в код инструкции Serial.print (), которые я НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ развивать в качестве привычки программирования. Это облегчает именно то упражнение, которое я предлагаю. (Спросите меня, почему я выработал эту привычку для всего, что я кодировал в течение последних 30 лет.)
К сожалению, большинство людей оставляют несколько комментариев здесь и там, что полезно 5 лет спустя, если у вас есть исходный код. Лично я комментирую КАЖДУЮ СТРОКУ исходного кода. Но комментарии в исходном коде не помогают в дальнейшем в подобной ситуации, так как компилятор не помещает их в машинный код, который он генерирует. (Возможно, это может быть ценным вариантом для компилятора. Да, для этого требуются байты, но насколько это может быть полезно спустя годы для важного проекта?)
Мои два цента стоят, что, вероятно, стоит той цены, которую заплатил читатель этого поста, чтобы увидеть это!
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Асинхронные вызовы функций в скетче ардуино
- Проблема с загрузкой моего скетча на Ардуино
- Что произойдет, если возникнет ошибка времени выполнения?
- Проблема: "stray '#' in program"
- Двигатель постоянного тока шумит, но не вращается
- Цикл While не прерывается
- как отправить аргумент объектам ESP8266WebServer в функции
http://electronics.stackexchange.com/questions/28211/backup-avr-with-avrdude но, как говорят другие, это выплевывает только шестнадцатеричные файлы, а не исходный источник Си., @jippie
Кросс сайт dupe: http://reverseengineering.stackexchange.com/q/125/189, @asheeshr