ฉันทำร่าง แต่แล้วฉันก็ทำมันหาย อย่างไรก็ตามฉันอัปโหลดไปยัง Arduino ก่อนที่จะสูญเสียมัน มีวิธีใดบ้างที่ฉันจะเอามันคืนมาได้?
ฉันทำร่าง แต่แล้วฉันก็ทำมันหาย อย่างไรก็ตามฉันอัปโหลดไปยัง Arduino ก่อนที่จะสูญเสียมัน มีวิธีใดบ้างที่ฉันจะเอามันคืนมาได้?
คำตอบ:
ควรเป็นไปได้ตราบใดที่ไม่ได้ตั้งค่าบิตความปลอดภัย คำถามนี้ถูกถามใน EE ในขณะที่กลับ
เป็นไปได้หรือไม่ที่จะดึงรหัสจากบอร์ด Arduino
แต่คุณจะไม่ได้รับรหัส Arduino ที่คุณเขียนกลับมา รหัสจะถูกรวบรวมไว้ในชุดประกอบและคุณจะต้องแปลงกลับเป็น C ด้วยตัวคุณเอง
คำตอบนี้ไม่ได้ตอบคำถามโดยตรง แต่ยังจะส่งผลให้ผลลัพธ์เดียวกัน
Arduino IDE ใช้ไดเรกทอรีชั่วคราวเพื่อจัดเก็บไฟล์บิลด์รวมถึงร่างต้นฉบับรวมถึงไฟล์ HEX และไฟล์ระดับกลาง
บน Mac สิ่งเหล่านี้อยู่ใน / var / โฟลเดอร์โดยค่าเริ่มต้นและบนเครื่อง Windows ที่อยู่ใน ... \ Local Settings \ Temp \ (ซึ่งขึ้นอยู่กับรุ่นของ Windows อาจอยู่ในหลาย ๆ ที่)
ฉันพบว่าโดยเฉพาะอย่างยิ่งใน Windows ไฟล์สร้างเหล่านี้จะไม่ถูกลบเมื่อคุณปิดแบบร่างหรือ IDE ดังนั้นอาจมีอยู่ในเครื่องของคุณนานกว่าที่คุณคิด
นอกจากนี้ตามค่าเริ่มต้น Crashplan, Backblaze และ Time Machine สำรองข้อมูลตำแหน่งเหล่านี้ดังนั้นแม้ว่าจะถูกลบไปแล้วก็ตามพวกเขาอาจยังอยู่ในการสำรองข้อมูล
ข้อได้เปรียบที่นี่คือคุณจะกู้คืนรหัส C แทน ASM
/tmp/
ไดเรกทอรีบน Linux (และแม้แต่ Mac) cf arduino.cc/th/Hacking/BuildProcess
คุณสามารถดาวน์โหลดฐานข้อมูลเลขฐานสิบหกของไฟล์ได้ แต่ไม่มีวิธีง่ายๆในการรับรหัส C ++ และความคิดเห็นทั้งหมด หากคุณสามารถเข้าใจแอสเซมบลีคุณสามารถสร้างโปรแกรมใหม่ แต่อาจใช้เวลาสักครู่ มีตัวแยกสัญญาณสำหรับอุปกรณ์บางตัวฉันไม่รู้เกี่ยวกับ arduino
atmega disassembler
)
ฉันคิดว่ามีวิธีอื่นในการทำเช่นนี้โดยไม่ต้องแยกรหัสจากบอร์ด Arduino จำวันที่ที่คุณสร้างร่างและค้นหาใน C: \ Users \ User \ AppData \ Local \ Temp \ (ตัวอย่างเช่น: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a) คุณสามารถค้นหารหัสที่ไม่ได้บันทึกของคุณได้เว้นแต่จะถูกลบโดย "โปรแกรมเพิ่มพื้นที่ว่าง" บางโปรแกรม โชคดี!
หากคุณไม่มีวัตถุประสงค์เพื่อคัดลอกรหัสที่เหมือนกันไปยังอุปกรณ์อื่นคำตอบง่ายๆคือ: ไม่
ดังที่ได้อธิบายไว้ในคำตอบอื่น ๆ คุณสามารถเปลี่ยนรหัสฐานสิบหกบนอุปกรณ์กลับไปเป็นรหัสแอสเซมเบลอร์
ตัวอย่างเช่น (เมื่อคุณคัดลอกรหัสจากอุปกรณ์กลับสู่ดิสก์ของคุณ):
avr-objdump -j .sec1 -d -m avr5 yourFileHere.hex
ทำงานกับไฟล์ bootloader ไฟล์ใดไฟล์หนึ่งที่ฉันได้รับผลลัพธ์เหล่านี้ (บางส่วน):
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
อย่างที่คุณเห็นไม่มีประโยชน์อย่างยิ่งในการทำซ้ำสิ่งที่ร่างของคุณทำ มีแนวโน้มว่าจะเป็นหนึ่งในสองสถานการณ์:
ในกรณี "ร่างสั้น" คุณจะดีกว่าแค่เขียนใหม่ตั้งแต่ต้น นั่นจะเร็วขึ้นอย่างแน่นอน ในกรณี "ร่างยาว" - มันก็ไม่คุ้มค่า ไม่มีชื่อตัวแปรใดที่ถูกสงวนไว้และวิธีที่คอมไพเลอร์ปรับรหัสให้เหมาะสมแม้โครงสร้างของรหัสจะยากต่อการพิจารณา