Arduino에서 스케치를 다운로드 할 수있는 방법이 있습니까?


답변:


35

보안 비트가 설정되어 있지 않는 한 가능해야합니다. 이 질문은 EE에서 잠시 전에 물었습니다.

arduino 보드에서 코드를 추출 할 수 있습니까?

그러나 당신은 당신이 쓴 Arduino 코드를 얻지 못할 것입니다. 코드는 어셈블리로 컴파일되며이를 C로 직접 변환해야합니다.


원시 16 진수를 다시 읽으십시오 : 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은 이러한 위치를 백업하므로 삭제 된 경우에도 여전히 백업에있을 수 있습니다.

여기서 장점은 ASM 대신 C 코드를 복구한다는 것입니다.


3
이것이 IMHO 최고의 솔루션입니다. 매우 독창적입니다.
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 ++ 코드 및 주석을 얻는 쉬운 방법은 없습니다. 어셈블리를 이해할 수 있으면 프로그램을 다시 만들 수 있지만 시간이 오래 걸립니다. 일부 장치에 사용할 수있는 dissasembler가 있습니다. arduino에 대해 잘 모릅니다.


3
arduino에는 MCU 유형이 아니기 때문에 디스어셈블러가 없습니다. ATmega 디스어셈블러 (google ) 여러 개 있습니다 . atmega disassembler
코너 울프

arduino 환경이 있다면 avr-gcc와 함께 제공되는 avr-objdump가 이미 있습니다.
Chris Stratton

원시 16 진수를 다시 읽으십시오 : 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

보시다시피 스케치 작업을 재현하는 데 특히 도움이되지는 않습니다. 두 가지 시나리오 중 하나가있을 수 있습니다.

  • 스케치가 짧았습니다.이 경우 몇 주 동안 작업 한 후 어셈블러 코드를 다시 C
  • 스케치가 길면 C로 되돌릴 수 없습니다.

"짧은 스케치"의 경우 처음부터 다시 쓰는 것이 좋습니다. 거의 확실히 빠를 것입니다. "긴 스케치"의 경우 가치가 없습니다. 변수 이름은 유지되지 않으며 컴파일러가 코드를 최적화하는 방식은 물론 코드 구조를 결정하기도 어렵습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.