Có cách nào để tải xuống một bản phác thảo từ Arduino không?


44

Tôi đã làm một bản phác thảo, nhưng sau đó tôi đã mất nó. Tuy nhiên, tôi đã tải nó lên Arduino trước khi mất nó. Có cách nào tôi có thể lấy lại?


5
Electronics.stackexchange.com/questions/28211/, nhưng như những người khác nói, điều này chỉ tạo ra các tệp .hex, không phải là nguồn C gốc.
jippie

Hội Chữ thập trang web dupe: reverseengineering.stackexchange.com/q/125/189
asheeshr

Câu trả lời:


35

Nó có thể được miễn là bit bảo mật không được thiết lập. Câu hỏi này đã được hỏi về EE một thời gian trước.

Có thể trích xuất mã từ một bảng arduino?

Nhưng bạn sẽ không nhận được mã Arduino mà bạn đã viết lại. Mã được biên dịch thành hội đồng và bạn sẽ phải tự chuyển đổi lại thành C.


Đọc lại hex liệu: forum.arduino.cc/index.php?topic=6150.0 và kỹ thuật tự Thao tác tháo lắp: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

20

Câu trả lời này không trả lời trực tiếp câu hỏi, nhưng vẫn sẽ dẫn đến kết quả cuối cùng.

Arduino IDE sử dụng các thư mục tạm thời để lưu trữ các tệp xây dựng, bao gồm bản phác thảo gốc cũng như HEX và các tệp trung gian.

Trên máy Mac, các tệp này nằm trong / var / theo mặc định và trên máy Windows, chúng ở trong chế độ cục bộ \ Cài đặt cục bộ \ Temp \ (tùy thuộc vào phiên bản Windows có thể ở một số vị trí).

Tôi đã thấy rằng đặc biệt là trong Windows, các tệp xây dựng này không bị xóa khi bạn đóng bản phác thảo hoặc IDE, vì vậy chúng có thể tồn tại trên máy của bạn lâu hơn bạn nghĩ.

Ngoài ra, theo mặc định, Crashplan, Backblaze và Time Machine sao lưu các vị trí này, vì vậy ngay cả khi chúng đã bị xóa, chúng vẫn có thể nằm trong bản sao lưu.

Ưu điểm ở đây là bạn sẽ phục hồi mã C chứ không phải ASM.


3
Đây là giải pháp tốt nhất IMHO. Cũng rất sáng tạo ...
dda

1
Bạn có thể tìm thấy điều này trong các /tmp/thư mục trên Linux (và thậm chí cả Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12

Comment tiếng vang từ câu trả lời được chấp nhận: Đọc lại hex liệu: forum.arduino.cc/index.php?topic=6150.0 và kỹ thuật tự Thao tác tháo lắp: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

Bạn có thể tải xuống kết xuất hex của tệp, nhưng không có cách nào dễ dàng để có được tất cả các mã và nhận xét C ++. Nếu bạn có thể hiểu lắp ráp, bạn có thể tạo lại chương trình, nhưng sẽ mất một lúc. Có một số bộ lọc có sẵn cho một số thiết bị, tôi không biết về arduino.


3
Không có trình phân tách cho arduino, vì nó không phải là loại MCU. Có rất nhiều ATmega disassemblers (google atmega disassembler).
Sói Connor

Nếu bạn có envitonment arduino, bạn đã có avr-objdump vì nó đi kèm với avr-gcc.
Chris Stratton

Đọc lại hex liệu: forum.arduino.cc/index.php?topic=6150.0 và kỹ thuật tự Thao tác tháo lắp: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

Tôi nghĩ rằng có một cách khác để làm điều này, mà không cần trích xuất mã từ bảng Arduino. Ghi lại ngày bạn tạo bản phác thảo và tìm nó trong C: \ Users \ User \ AppData \ Local \ Temp \ (Ví dụ: C: \ Users \ User \ AppData \ Local \ Temp \ unsitle4390292704786567977.tmp \ sketch_jan19a). Bạn có thể tìm thấy mã chưa được lưu của mình trừ khi nó bị xóa bởi một số "chương trình giải phóng không gian". Chúc may mắn!


4

Trừ khi mục tiêu của bạn chỉ đơn giản là sao chép mã giống hệt sang thiết bị khác, câu trả lời đơn giản là: không

Như đã được chỉ ra trong các câu trả lời khác, bạn có thể biến mã hex trên thiết bị thành mã trình biên dịch.

Ví dụ: (khi bạn đã sao chép mã từ thiết bị trở lại vào đĩa của mình):

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

Chạy trên một trong các tệp bootloader tôi nhận được các kết quả này (một phần):

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

Như bạn có thể thấy, không đặc biệt hữu ích cho việc tái tạo những gì bản phác thảo của bạn đã làm. Có khả năng là một trong hai kịch bản:

  • Bản phác thảo của bạn rất ngắn, trong trường hợp bạn có thể, sau nhiều tuần làm việc, biến mã trình biên dịch trở lại thành C
  • Bản phác thảo của bạn đã dài, trong trường hợp đó hầu như không thể biến nó trở lại thành C

Trong trường hợp "phác thảo ngắn", tốt hơn hết bạn chỉ nên viết lại từ đầu. Điều đó sẽ nhanh hơn, gần như chắc chắn. Trong trường hợp "phác thảo dài" - nó không có giá trị. Không có tên biến nào được bảo toàn và cách trình biên dịch tối ưu hóa mã, thậm chí cấu trúc của mã sẽ khó xác định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.