Est-il possible de télécharger un croquis à partir d'un Arduino?

44

J'ai fait un croquis, mais ensuite je l'ai perdu. Cependant, je l'ai téléchargé sur l'Arduino avant de le perdre. Y a-t-il un moyen de le récupérer?

Le gars avec le chapeau
la source
5
electronics.stackexchange.com/questions/28211/… mais comme d’autres le disent, cela crache uniquement les fichiers .hex, pas la source C d’origine.
Jippie
Dupe sur les
asheeshr

Réponses:

35

Cela devrait être possible tant que le bit de sécurité n'est pas activé. Cette question a été posée sur EE il y a quelque temps.

Est-il possible d'extraire le code d'une carte Arduino?

Mais vous ne récupérerez pas le code Arduino que vous avez écrit. Le code est compilé en assemblage et vous devrez le reconvertir vous-même.

Sachleen
la source
20

Cette réponse ne répond pas directement à la question, mais aboutira toujours au même résultat final.

L'IDE Arduino utilise des répertoires temporaires pour stocker les fichiers de construction, y compris l'esquisse d'origine, ainsi que les fichiers HEX et intermédiaires.

Sur un Mac, ceux-ci se trouvent par défaut dans / var /, et sur un ordinateur Windows, ils se trouvent dans… \ Local Settings \ Temp \ (qui, selon la version de Windows, pourrait se trouver à plusieurs endroits).

J'ai constaté qu'en particulier dans Windows, ces fichiers de construction ne sont pas supprimés lorsque vous fermez l'esquisse ou l'EDI; ils peuvent donc exister sur votre ordinateur plus longtemps que prévu.

De plus, par défaut, Crashplan, Backblaze et Time Machine sauvegardent ces emplacements. Par conséquent, même s'ils ont été supprimés, ils peuvent toujours figurer dans une sauvegarde.

L'avantage ici est que vous récupérerez le code C plutôt que ASM.

Cybergibbons
la source
3
Ceci est la meilleure solution à mon humble avis. Très créatif, aussi ...
dda
1
Vous le trouverez peut-être dans les /tmp/répertoires de Linux (et même de Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12
Commentaire echo de la réponse acceptée: Relecture de l' hex brut: forum.arduino.cc/index.php?topic=6150.0 et désassemblage automatique: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar
5

Vous pouvez télécharger le vidage hexadécimal du fichier, mais il n’existe pas de moyen simple d’obtenir tout le code C ++ et ses commentaires. Si vous comprenez assemblage, vous pouvez recréer le programme, mais cela prendrait un certain temps. Il existe des dissasembleurs disponibles pour certains appareils, je ne connais pas Arduino.

Le docteur
la source
3
Il n'y a pas de désassembleur pour arduino, car ce n'est pas un type MCU. Il existe plusieurs désassembleurs ATmega (Google atmega disassembler).
Connor Wolf
Si vous avez l’environnement arduino, vous avez déjà avr-objdump car il vient avec avr-gcc.
Chris Stratton
5

Je pense qu'il y a une autre façon de faire cela, sans extraire le code de la carte Arduino. Conservez la date à laquelle vous créez l'esquisse et recherchez-la dans C: \ Utilisateurs \ Utilisateur \ AppData \ Local \ Temp \ (Par exemple: C: \ Utilisateurs \ Utilisateur \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Vous pourriez trouver votre code non enregistré à moins qu'il ne soit supprimé par un "programme d'espace libre". Bonne chance!

Zathura
la source
4

Sauf si votre objectif est simplement de copier le code identique sur un autre appareil, la réponse simple est: non

Comme cela a été souligné dans d'autres réponses, vous pouvez reconvertir le code hexadécimal de l'appareil en code assembleur.

Par exemple (une fois que vous avez copié le code de l'appareil sur votre disque):

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

Exécuté sur l’un des fichiers du chargeur de démarrage, j’obtiens ces résultats (en partie):

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

Comme vous pouvez le constater, ce n'est pas particulièrement utile pour reproduire ce que votre dessin a fait. Il y a probablement deux scénarios:

  • Votre croquis était court, auquel cas vous pourriez, après des semaines de travail, reconvertir le code assembleur en C
  • Votre croquis était long, auquel cas il serait pratiquement impossible de le reconvertir en C

Dans le cas du "sketch", il est préférable de réécrire à partir de zéro. Ce serait plus rapide, presque certainement. Dans le cas du "long sketch", cela ne vaut tout simplement pas la peine. Aucun des noms de variable n'est préservé, et la manière dont le compilateur optimise le code, même la structure du code, serait difficile à déterminer.

Nick Gammon
la source