スケッチをしましたが、それを失いました。ただし、失う前にArduinoにアップロードしました。戻す方法はありますか?
スケッチをしましたが、それを失いました。ただし、失う前にArduinoにアップロードしました。戻す方法はありますか?
回答:
セキュリティビットが設定されていない限り可能です。この質問は、しばらく前にEEで尋ねられました。
ただし、書き戻したArduinoコードは取得できません。コードはアセンブリにコンパイルされ、それを自分でCに変換し直す必要があります。
この答えは質問に直接答えませんが、それでも同じ最終結果になります。
Arduino IDEは一時ディレクトリを使用して、元のスケッチ、HEX、中間ファイルなどのビルドファイルを保存します。
Macでは、これらはデフォルトで/ var / foldersにあり、Windowsマシンでは…\ Local Settings \ Temp \(Windowsのバージョンによってはいくつかの場所にあります)にあります。
特にWindowsでは、これらのビルドファイルはスケッチやIDEを閉じても削除されないため、思ったよりもはるかに長くマシン上に存在する可能性があることがわかりました。
また、デフォルトでは、Crashplan、Backblaze、およびTime Machineはこれらの場所をバックアップします。したがって、それらが削除されていても、バックアップに残っている可能性があります。
ここでの利点は、ASMではなくCコードを回復できることです。
/tmp/
Linux(さらにはMac)のディレクトリにあります。cf arduino.cc/en/Hacking/BuildProcess
ファイルの16進ダンプをダウンロードできますが、すべてのC ++コードとコメントを取得する簡単な方法はありません。アセンブリを理解できる場合は、プログラムを再作成できますが、それには時間がかかります。一部のデバイスにはディスサンブラーがありますが、arduinoについては知りません。
atmega disassembler
)。
同じコードを別のデバイスに単純にコピーすることが目的でない限り、簡単な答えは次のとおりです。
他の回答で指摘されているように、デバイスの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つのシナリオのいずれかが考えられます。
「短いスケッチ」の場合は、ゼロから書き直す方が良いでしょう。それは、ほぼ確実に高速になります。「長いスケッチ」の場合-それだけの価値はありません。変数名はどれも保持されず、コンパイラーがコードを最適化する方法は、コードの構造でさえも決定が困難です。