Чи є спосіб завантажити ескіз з Arduino?


44

Я зробив ескіз, але потім втратив його. Однак я завантажив його в Ардуїно, перш ніж його втратити. Чи є якийсь спосіб я його повернути?


5
electronics.stackexchange.com/questions/28211/… але, як кажуть інші, це виплющує лише файли .hex, а не джерело C.
jippie

Cross site dupe
asheeshr

Відповіді:


35

Це повинно бути можливим до тих пір, поки біт безпеки не встановлений. Це питання було задано на EE деякий час назад.

Чи можливо витягнути код з ардуїнської дошки?

Але Arduino код, який ви написали, ви не отримаєте. Код складається у збірку, і вам доведеться самостійно перетворити його на C.


Читання назад шестигранної: forum.arduino.cc/index.php?topic=6150.0 та автоматичного розбирання: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

20

Ця відповідь не відповідає безпосередньо на питання, але все-таки призведе до того ж кінцевого результату.

Arduino IDE використовує тимчасові каталоги для зберігання збірних файлів, включаючи оригінальний ескіз, а також HEX та проміжні файли.

На Mac це типи в / var / папки за замовчуванням, а на машині Windows вони знаходяться в… \ Local Settings \ Temp \ (які залежно від версії Windows можуть бути в декількох місцях).

Я виявив, що особливо в Windows, ці файли збірки не видаляються, коли ви закриваєте ескіз чи IDE, тому вони можуть існувати на вашій машині набагато довше, ніж ви могли б подумати.

Також за замовчуванням ці місця зберігають резервні копії Crashplan, Backblaze та Time Machine, тому навіть якщо вони були видалені, вони все ще можуть бути в резервній копії.

Перевага тут полягає в тому, що ви відновите код C, а не ASM.


3
Це найкраще рішення ІМХО. Дуже творчий, теж ...
ДВР

1
Ви можете знайти це в /tmp/каталогах на Linux (і навіть на Mac). cf arduino.cc/en/Hacking/BuildProcess
pd12

Прокоментувати відлуння від прийнятої відповіді: Читання зворотнього шестигранника: forum.arduino.cc/index.php?topic=6150.0 та автоматичного розбирання: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

Ви можете завантажити шістнадцятковий дамп файлу, але не існує простого способу отримати весь код C ++ та коментарі. Якщо ви можете зрозуміти складання, ви могли б відтворити програму, але це займе певний час. Для деяких пристроїв доступні розбиральники, я не знаю про ардуїно.


3
Розбирачів для ардуїно немає, тому що це не тип MCU. Там є кілька ATMEGA дизассемблеров (Google atmega disassembler).
Вонор Коннор

Якщо у вас є оточення arduino, у вас вже є avr-objdump, оскільки він поставляється з avr-gcc.
Кріс Страттон

Читання зворотнього шестигранника: forum.arduino.cc/index.php?topic=6150.0 та автоматичне розбирання: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

Я думаю, що є інший спосіб зробити це, не виймаючи код з дошки Arduino. Згадайте дату створення ескізу та шукайте його в C: \ Users \ User \ AppData \ Local \ Temp \ (Наприклад: C: \ Users \ User \ AppData \ Local \ Temp \ untitled4390292704786567977.tmp \ sketch_jan19a). Ви можете знайти свій збережений код, якщо його не було видалено якоюсь "програмою для звільнення простору". Удачі!


4

Якщо ваша мета - просто скопіювати ідентичний код на інший пристрій, проста відповідь: ні

Як було зазначено в інших відповідях, ви можете перетворити шістнадцятковий код на пристрої в код асемблера.

Наприклад (після того, як ви скопіювали код з пристрою на свій диск):

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

Запустити один із файлів завантажувача, я отримую ці результати (частково):

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

Як бачите, не особливо корисно для відтворення того, що зробив ваш ескіз. Можливо, існує один із двох сценаріїв:

  • Ваш ескіз був коротким, і в цьому випадку ви можете після тижнів роботи перетворити код асемблера на C
  • Ваш ескіз був довгим, і в цьому випадку повернути його в С було б практично неможливо

У випадку "короткого ескізу" вам краще просто переписати з нуля. Це було б швидше, майже напевно. У випадку з "довгим ескізом" - це просто не варто. Жодне із назв змінних не збережене, а те, як компілятор оптимізує код, важко визначити навіть структуру коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.