Czy jest jakiś sposób, aby pobrać szkic z Arduino?

44

Zrobiłem szkic, ale potem go zgubiłem. Jednak przesłałem go do Arduino, zanim go zgubiłem. Czy jest jakiś sposób, aby go odzyskać?

Facet z kapeluszem
źródło
5
electronics.stackexchange.com/questions/28211/... ale jak mówią inni, to wyrzuca tylko pliki .hex, a nie źródłowe źródło C.
jippie
Dupe
asheeshr

Odpowiedzi:

20

Ta odpowiedź nie odpowiada bezpośrednio na pytanie, ale nadal spowoduje taki sam wynik końcowy.

Arduino IDE używa tymczasowych katalogów do przechowywania plików kompilacji, w tym oryginalnego szkicu, a także plików HEX i pośrednich.

Na komputerze Mac są one domyślnie w folderach / var /, a na komputerze z systemem Windows znajdują się w… \ Local Settings \ Temp \ (które w zależności od wersji systemu Windows mogą znajdować się w kilku miejscach).

Odkryłem, że szczególnie w systemie Windows te pliki kompilacji nie są usuwane po zamknięciu szkicu lub IDE, więc mogą istnieć na twoim komputerze o wiele dłużej, niż myślisz.

Domyślnie Crashplan, Backblaze i Time Machine tworzą kopie zapasowe tych lokalizacji, więc nawet jeśli zostały usunięte, nadal mogą znajdować się w kopii zapasowej.

Zaletą jest to, że odzyskasz kod C zamiast ASM.

Cybergibbons
źródło
3
To najlepsze rozwiązanie IMHO. Bardzo kreatywny też ...
dda
1
Możesz to znaleźć w /tmp/katalogach w systemie Linux (a nawet Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12 10.10.16
Komentarz echa z zaakceptowanej odpowiedzi: Czytanie nieprzetworzonego hex: forum.arduino.cc/index.php?topic=6150.0 i automatyczny demontaż: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar
5

Możesz pobrać zrzut heksowy pliku, ale nie ma łatwego sposobu na uzyskanie całego kodu C ++ i komentarzy. Jeśli potrafisz zrozumieć montaż, możesz odtworzyć program, ale zajmie to trochę czasu. Dla niektórych urządzeń dostępne są dyssasemblery, nie wiem o arduino.

Doktor
źródło
3
Dla arduino nie ma deasemblerów, ponieważ nie jest to typ MCU. Tam wiele ATmega deasembler (Google atmega disassembler).
Connor Wolf
Jeśli masz środowisko arduino, masz już avr-objdump, tak jak w avr-gcc.
Chris Stratton
Czytanie nieprzetworzonego hex: forum.arduino.cc/index.php?topic=6150.0 i automatyczny demontaż: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar
5

Myślę, że jest na to inny sposób, bez wyciągania kodu z tablicy Arduino. Zapamiętaj datę utworzenia szkicu i poszukaj go w C: \ Users \ User \ AppData \ Local \ Temp \ (Na przykład: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Możesz znaleźć niezapisany kod, chyba że zostanie on usunięty przez jakiś „program kosmiczny zwalniający”. Powodzenia!

Zathura
źródło
4

O ile Twoim celem nie jest po prostu skopiowanie identycznego kodu na inne urządzenie, prosta odpowiedź brzmi: nie

Jak wskazano w innych odpowiedziach, możesz zmienić kod szesnastkowy urządzenia z powrotem w kod asemblera.

Na przykład (po skopiowaniu kodu z urządzenia z powrotem na dysk):

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

Uruchom na jednym z plików bootloadera, otrzymuję te wyniki (częściowo):

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

Jak widać, niezbyt przydatne do odtworzenia tego, co zrobił szkic. Prawdopodobnie będzie jeden z dwóch scenariuszy:

  • Twój szkic był krótki, w którym to przypadku możesz po tygodniach pracy zmienić kod asemblera z powrotem w C
  • Twój szkic był długi, w takim przypadku praktycznie niemożliwe byłoby jego ponowne przekształcenie w C

W przypadku „krótkiego szkicu” lepiej jest po prostu przepisać od nowa. Byłoby to prawie na pewno szybsze. W przypadku „długiego szkicu” - po prostu nie jest tego warte. Żadna z nazw zmiennych nie jest zachowana, a sposób kompilatora optymalizuje kod, nawet struktura kodu byłaby trudna do ustalenia.

Nick Gammon
źródło