Arduinoからスケッチをダウンロードする方法はありますか?


44

スケッチをしましたが、それを失いました。ただし、失う前にArduinoにアップロードしました。戻す方法はありますか?


5
electronics.stackexchange.com/questions/28211/…しかし、他の人が言うように、これは元のCソースではなく、.hexファイルのみを吐き出します。
ジッピー

クロスサイトデュープ:reverseengineering.stackexchange.com/q/125/189
asheeshr

回答:


35

セキュリティビットが設定されていない限り可能です。この質問は、しばらく前にEEで尋ねられました。

Arduinoボードからコードを抽出することは可能ですか?

ただし、書き戻した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 / foldersにあり、Windowsマシンでは…\ Local Settings \ Temp \(Windowsのバージョンによってはいくつかの場所にあります)にあります。

特にWindowsでは、これらのビルドファイルはスケッチやIDEを閉じても削除されないため、思ったよりもはるかに長くマシン上に存在する可能性があることがわかりました。

また、デフォルトでは、Crashplan、Backblaze、およびTime Machineはこれらの場所をバックアップします。したがって、それらが削除されていても、バックアップに残っている可能性があります。

ここでの利点は、ASMではなくCコードを回復できることです。


3
これが私見の最高のソリューションです。非常に創造的でも
...-dda

1
これは/tmp/Linux(さらにはMac)のディレクトリにあります。cf arduino.cc/en/Hacking/BuildProcess
pd12

受け入れられた回答からのコメントエコー:生の16進数の読み取りforum.arduino.cc/index.php?topic=6150.0 および自動逆アセンブリ: forum.arduino.cc/index.php/topic,46843.0.html
SDsolar

5

ファイルの16進ダンプをダウンロードできますが、すべてのC ++コードとコメントを取得する簡単な方法はありません。アセンブリを理解できる場合は、プログラムを再作成できますが、それには時間がかかります。一部のデバイスにはディスサンブラーがありますが、arduinoについては知りません。


3
arduinoはMCUタイプではないため、逆アセンブラはありません。あります複数のATMEGAの逆アセンブラは、(グーグルatmega disassembler)。
コナーウルフ14

arduino環境がある場合、avr-gccに付属しているavr-objdumpが既にあります。
クリスストラットン

生のヘックスを読み戻す: 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

同じコードを別のデバイスに単純にコピーすることが目的でない限り、簡単な答えは次とおりです。

他の回答で指摘されているように、デバイスの16進コードをアセンブラーコードに戻すことができます。

例(デバイスからディスクにコードをコピーした後):

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

ご覧のとおり、スケッチの内容を再現するのに特に役立ちません。次の2つのシナリオのいずれかが考えられます。

  • あなたのスケッチは短かったので、その場合は、数週間の作業の後、アセンブラコードをCに戻すことができます
  • スケッチが長かったため、Cに戻すことは事実上不可能でした。

「短いスケッチ」の場合は、ゼロから書き直す方が良いでしょう。それは、ほぼ確実に高速になります。「長いスケッチ」の場合-それだけの価値はありません。変数名はどれも保持されず、コンパイラーがコードを最適化する方法は、コードの構造でさえも決定が困難です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.