Apakah ada cara untuk mengunduh sketsa dari Arduino?


44

Saya membuat sketsa, tetapi kemudian saya kehilangan itu. Namun, saya mengunggahnya ke Arduino sebelum kehilangannya. Apakah ada cara saya bisa mendapatkannya kembali?


5
electronics.stackexchange.com/questions/28211/... tetapi seperti yang orang lain katakan, ini hanya memuntahkan file .hex, bukan sumber C yang berasal.
jippie

Jawaban:


35

Itu harus dimungkinkan selama bit keamanan tidak diatur. Pertanyaan ini ditanyakan pada EE beberapa waktu lalu.

Apakah mungkin untuk mengekstrak kode dari papan Arduino?

Tetapi Anda tidak akan mendapatkan kode Arduino yang Anda tulis kembali. Kode ini dikompilasi menjadi rakitan dan Anda harus mengubahnya kembali ke C sendiri.



20

Jawaban ini tidak langsung menjawab pertanyaan, tetapi masih akan menghasilkan hasil akhir yang sama.

Arduino IDE menggunakan direktori sementara untuk menyimpan file build, termasuk sketsa asli serta HEX dan file perantara.

Pada Mac, ini ada di / var / folder secara default, dan pada mesin Windows mereka berada di ... \ Local Settings \ Temp \ (yang tergantung pada versi Windows bisa di beberapa tempat).

Saya telah menemukan bahwa terutama di Windows, file-file build ini tidak terhapus ketika Anda menutup sketsa atau IDE, jadi mereka mungkin ada di komputer Anda lebih lama dari yang Anda kira.

Selain itu, secara default, Crashplan, Backblaze, dan Time Machine mencadangkan lokasi ini, sehingga meskipun telah dihapus, mereka mungkin masih dalam cadangan.

Keuntungannya di sini adalah Anda akan memulihkan kode C daripada ASM.


3
Ini adalah solusi IMHO terbaik. Sangat kreatif juga ...
dda

1
Anda dapat menemukannya di /tmp/direktori di Linux (dan bahkan Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12

Komentar bergema dari jawaban yang diterima: Membaca kembali hex mentah: forum.arduino.cc/index.php?topic=6150.0 dan Pembongkaran Otomatis: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

Anda dapat mengunduh hex dump dari file tersebut, tetapi tidak ada cara mudah untuk mendapatkan semua kode C ++ dan komentar. Jika Anda dapat memahami perakitan, Anda dapat membuat ulang program, tetapi itu akan memakan waktu cukup lama. Ada dissasembler yang tersedia untuk beberapa perangkat, saya tidak tahu tentang Arduino.


3
Tidak ada disassembler untuk Arduino, karena itu bukan tipe MCU. Ada yang beberapa ATmega disassemblers (google atmega disassembler).
Connor Wolf

Jika Anda memiliki lingkungan arduino, Anda sudah memiliki avr-objdump karena dilengkapi dengan avr-gcc.
Chris Stratton


5

Saya pikir ada cara lain untuk melakukan ini, tanpa mengekstrak kode dari papan Arduino. Lihat tanggal Anda membuat sketsa, dan cari di C: \ Users \ User \ AppData \ Local \ Temp \ (Misalnya: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Anda dapat menemukan kode yang belum disimpan kecuali dihapus oleh "program ruang bebas". Semoga berhasil!


4

Kecuali jika tujuan Anda hanya menyalin kode identik ke perangkat lain, jawabannya adalah: tidak

Seperti yang telah ditunjukkan dalam jawaban lain, Anda dapat mengubah kode heks pada perangkat kembali menjadi kode assembler.

Misalnya (setelah Anda menyalin kode dari perangkat kembali ke disk Anda):

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

Jalankan pada salah satu file bootloader saya mendapatkan hasil ini (sebagian):

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

Seperti yang Anda lihat, tidak terlalu membantu untuk mereproduksi apa yang sketsa Anda lakukan. Kemungkinan ada satu dari dua skenario:

  • Sketsa Anda pendek, sehingga Anda mungkin, setelah berminggu-minggu bekerja, mengubah kode assembler kembali menjadi C
  • Sketsa Anda panjang, sehingga tidak mungkin mengubahnya menjadi C

Dalam kasus "sketsa pendek", Anda lebih baik menulis ulang dari awal. Itu akan lebih cepat, hampir pasti. Dalam kasus "sketsa panjang" - itu tidak layak. Tak satu pun dari nama variabel dipertahankan, dan cara kompiler mengoptimalkan kode, bahkan struktur kode akan sulit ditentukan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.