Gibt es eine Möglichkeit, eine Skizze von einem Arduino herunterzuladen?

44

Ich habe eine Skizze gemacht, aber dann habe ich sie verloren. Ich habe es jedoch auf das Arduino hochgeladen, bevor ich es verloren habe. Kann ich es auf irgendeine Weise zurückbekommen?

Der Typ mit dem Hut
quelle
5
electronics.stackexchange.com/questions/28211/… aber wie andere sagen, spuckt dies nur hexadezimale Dateien aus, nicht die ursprüngliche C-Quelle.
jippie

Antworten:

35

Dies sollte möglich sein, solange das Sicherheitsbit nicht gesetzt ist. Diese Frage wurde EE vor einiger Zeit gestellt.

Ist es möglich, Code von einem Arduino-Board zu extrahieren?

Sie erhalten jedoch nicht den Arduino-Code, den Sie zurückgeschrieben haben. Der Code wird in Assembler kompiliert, und Sie müssen ihn selbst zurück in C konvertieren.

Sachleen
quelle
Lesen Sie den rohen Hex zurück: forum.arduino.cc/index.php?topic=6150.0 und Automatic Disassembly: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar
20

Diese Antwort beantwortet die Frage nicht direkt, führt jedoch zu demselben Endergebnis.

Die Arduino IDE verwendet temporäre Verzeichnisse zum Speichern von Build-Dateien, einschließlich der ursprünglichen Skizze sowie der HEX- und Zwischendateien.

Auf einem Mac befinden sich diese standardmäßig in / var / und auf einem Windows-Computer in… \ Local Settings \ Temp \ (je nach Windows-Version an mehreren Stellen).

Ich habe festgestellt, dass diese Build-Dateien vor allem in Windows nicht gelöscht werden, wenn Sie die Skizze oder die IDE schließen, sodass sie möglicherweise viel länger auf Ihrem Computer vorhanden sind, als Sie denken.

Standardmäßig sichern Crashplan, Backblaze und Time Machine diese Speicherorte. Selbst wenn sie gelöscht wurden, befinden sie sich möglicherweise noch in einer Sicherung.

Der Vorteil hierbei ist, dass Sie C-Code und nicht ASM wiederherstellen.

Cybergibbons
quelle
3
Dies ist meiner Meinung nach die beste Lösung. Sehr kreativ auch ...
dda
1
Möglicherweise finden Sie dies in /tmp/Verzeichnissen unter Linux (und sogar unter Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12
Kommentarecho von der akzeptierten Antwort : Rücklesen des
unformatierten
5

Sie können den Hex-Dump der Datei herunterladen, aber es gibt keine einfache Möglichkeit, den gesamten C ++ - Code und die Kommentare abzurufen. Wenn Sie Assembler verstehen, können Sie das Programm neu erstellen, aber das würde eine Weile dauern. Es gibt Dissembler für einige Geräte, ich weiß nicht über Arduino.

Der Arzt
quelle
3
Es gibt keine Disassembler für Arduino, da es sich nicht um einen MCU-Typ handelt. Es gibt mehrere ATmega- Disassembler (Google atmega disassembler).
Connor Wolf
Wenn Sie die Arduino-Umgebung haben, haben Sie bereits avr-objdump, wie es mit avr-gcc kommt.
Chris Stratton
Lesen Sie das unformatierte Hex zurück: forum.arduino.cc/index.php?topic=6150.0 und Automatic Disassembly: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar
5

Ich denke, es gibt einen anderen Weg, dies zu tun, ohne den Code aus dem Arduino-Board zu extrahieren. Merken Sie sich das Datum, an dem Sie die Skizze erstellt haben, und suchen Sie danach in C: \ Users \ User \ AppData \ Local \ Temp \ (Beispiel: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Sie könnten Ihren ungespeicherten Code finden, es sei denn, er wurde von einem "Freispeicherprogramm" gelöscht. Viel Glück!

Zathura
quelle
4

Wenn Sie nicht einfach den identischen Code auf ein anderes Gerät kopieren möchten, lautet die einfache Antwort: Nein

Wie bereits in anderen Antworten erwähnt, können Sie den Hex-Code auf dem Gerät wieder in Assembler-Code umwandeln.

Zum Beispiel (nachdem Sie den Code vom Gerät zurück auf Ihre Festplatte kopiert haben):

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

Führen Sie eine der Bootloader-Dateien aus. Ich erhalte die folgenden Ergebnisse (teilweise):

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

Wie Sie sehen, nicht besonders hilfreich für die Reproduktion Ihrer Skizze. Es gibt wahrscheinlich eines von zwei Szenarien:

  • Ihre Skizze war kurz. In diesem Fall könnten Sie nach wochenlanger Arbeit den Assembler-Code wieder in C umwandeln
  • Ihre Skizze war lang. In diesem Fall wäre es praktisch unmöglich, sie wieder in C umzuwandeln

Im Fall einer "kurzen Skizze" ist es besser, wenn Sie nur von Grund auf neu schreiben. Das wäre mit ziemlicher Sicherheit schneller. Im Fall der "langen Skizze" ist es das einfach nicht wert. Keiner der Variablennamen bleibt erhalten, und die Art und Weise, wie der Compiler den Code optimiert, ist schwer zu bestimmen, auch die Struktur des Codes.

Nick Gammon
quelle