아두 이노 부트 로더 세부 사항


11

Arduino 부트 로더 가 어떻게 작동 하는지 설명해 주 시겠습니까? 나는 여기서 높은 수준의 답변을 찾지 않고 코드를 읽었으며 요점을 얻습니다. 나는 또한이 다른 게시물을 읽었 습니다 (나는 그것에 대한 응답자 중 하나였습니다).

Arduino IDE와 부트 로더 코드 사이에 프로토콜 상호 작용이 많이 발생하여 궁극적으로 직렬 인터페이스를 통해 프로그램이 전송되는 플래시를 자체 프로그래밍하는 많은 인라인 어셈블리 명령이 발생합니다.

내가 확실하지 않은 것은 270 행에 있습니다.

void (*app_start)(void) = 0x0000; 

... 함수 포인터의 선언 및 NULL로 초기화로 인식합니다. 부트 로더가 사용자가로드 한 코드의 실행을 위임하기 위해 app_start에 대한 후속 호출이 있습니다.

확실하게, 어떻게 든 app_start이것이 모두 합쳐지기 위해서는 어떤 시점에서 NULL이 아닌 값을 가져와야합니다. 부트 로더 코드에서 부트 로더가로드하는 프로그램에 의해 마 법적으로 연결되어있는 것을 보지 못했습니다. 부트 로더의 메인은 칩 리셋 후 소프트웨어의 진입 점이라고 생각합니다.

70 개 정도의 줄에 싸인 app_start가 어디에 있는지 메인 프로그램에 알려주는 비밀 디코더 링이어야합니까? 아니면 아마도 Arduino IDE가 활용하는 암시 적 지식입니까? 내가 아는 전부는 누군가가 app_start를 0이 아닌 다른 곳을 가리 키도록 변경하지 않으면 부트 로더 코드가 영원히 회전한다는 것입니다. 그래서 트릭은 무엇입니까?

별도의 메모에서 부트 로더 코드가 인터럽트에 의존 할 수 있습니까? 아니요?

편집하다

부트 로더 코드를위한 별도의 메모리 공간이없는 Tiny AVR (특히 ATTiny44A)로 부트 로더를 이식하려고합니다. 부트 로더 코드가 특정 퓨즈 설정과 칩 지원에 의존한다는 것이 분명해 지므로, 내가 실제로 관심을 갖는 것은 부트 퓨즈를 퓨즈와 하드웨어가없는 칩으로 이식하는 데 무엇이 필요한지 추측합니다. 지원 (그러나 여전히 자체 프로그래밍 기능이 있습니까?)

USI를 반이중 UART로 사용하기 위해 AVR307의 구현을 사용할 수 있다고 생각했습니다 (Timer0 인터럽트 및 핀 변경 인터럽트 사용). 누구든지 부트 로더에 대한 하드웨어 지원이없는 칩에 대한 부트 로더 코드 작성 / 이동 방법에 대한 지침을 제공 할 수 있습니까?

부트 로더 코드를 주소 main (예 : 0x029e 또는 컴파일러가 main을 두는 곳)의 정상적인 위치에 두는 것으로 가정합니다. 그런 다음 부트 로더 코드의 'address'가 main의 끝을 지나쳐 오프셋을 추가하고 'app_start'를 해당 주소로 설정하도록했습니다. 이것에 대해 올바르게 생각하고 있습니까? 아니면 완전히 빠진 것이 있습니까? 감사!

편집 2

FWIW, 난에 대한 문서화 된 프로세스를 발견 ATTiny85에 아두 이노 스케치를로드하는 방법 내가 생각 멋지다 ... 난 원래이 질문에가는 곳이다,


1
stackoverflow.com/questions/3652233/arduino-bootloader/… 내 대답이 어디로 갔는지 궁금했습니다 ...
Nick T

답변:


12
void (*app_start)(void) = 0x0000; 

이것은 NULL 포인터가 아닙니다. 이것은 실제로 부트 로더가 이동하는 응용 프로그램 코드의 시작 주소입니다. 링커는 응용 프로그램 코드가 주소 0에서 시작되도록 정렬합니다. ATMEGA168 데이터 시트의 표 26-6을 참조하십시오.

부트 로더 코드는 플래시에서 더 높아집니다. 정확한 위치는 부트 로더 퓨즈에 따라 다릅니다.


부트 로더 메인 코드는 어디에
있습니까

1
@Joby, ah ok ... 내 질문에 대한 업데이트를 참조하십시오-부트 로더를 부팅 로더 코드를위한 별도의 메모리 공간이없는 Tiny AVR로 이식하려고합니다.
vicatcu

1
@Joby, 부트 로더 코드는 "... 리셋 후 부트 벡터가 부트 플래시 시작 주소를 가리 키도록 부트 리셋 퓨즈를 프로그래밍 할 수 있습니다.이 경우 부트 로더는 리셋 후 시작됩니다. "
vicatcu

3
Arduino 부트 로더를 구체적으로 원하십니까? STK500 프로그래머를 에뮬레이트하며 다소 부피가 큽니다. 부트 로더 디렉토리에는 gcc-3을 사용하여 1K 이하로 컴파일되는 atmega8 버전이 있지만 사용 가능한 플래시는 상당히 짧습니다.
피터 깁슨

3
정말로 부트 로더를 원하십니까? 입지 조건이 ATTiny 것은 가능성의 가치는 (예 : usbTinyISP 등) ICSP 프로그래머를 사용하여 장치를 프로그래밍하는 당신의 노력입니다
SingleNegationElimination
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.