부트 로더 란 무엇이며 어떻게 개발합니까?


53

AVR 마이크로 컨트롤러가 부트 로더 (예 : Arduino)와 함께 사용하는 많은 프로젝트를 만났지만 그 개념을 잘 이해하지 못했습니다.

부트 로더 (어떻게 마이크로 컨트롤러 용)를 만들 수 있습니까?

부트 로더를 작성한 후 마이크로 컨트롤러에 어떻게 프로그래밍되어 있습니까 (예 : AVR의 플래시 ROM에 구운 .hex 프로그램 또는 다른 방법)?


10
부트 로더 태그로 태그를 달았습니다. 읽어 보셨습니까 ? 그렇다면 Arduino Bootloader , Arduino Bootloader Follow On , Arduino Bootloader , 부트 로더의 구조를 이해하는 데 유용한 도구 또는 방법Arduino Bootloader Details 질문 을 읽었 습니까? 그것들은 모두 당신의 초기 질문의 일부를 다룹니다. 나는 그것을 새로운 것들로 정리했다.
Kevin Vermeer

부트 로더 설계 방법에 관한 용지 : beningo.com/wp-content/uploads/images/Papers/...
YAHYA의 알타

2
@KevinVermeer 나는 그의 질문이 더 간단하다고 생각합니다.
richieqianle

답변:


103

부트 로더는 프로그래밍 할 마이크로 컨트롤러에서 실행되는 프로그램입니다. 일부 통신 수단을 통해 외부에서 새로운 프로그램 정보를 수신하고 해당 정보를 프로세서의 프로그램 메모리에 씁니다.

이는 프로그램을 마이크로 컨트롤러로 가져 오는 일반적인 방법과 대조적입니다. 마이크로 컨트롤러는 해당 목적을 위해 마이크로에 내장 된 특수 하드웨어를 통해 이루어집니다. PIC의 경우 SPI와 유사한 인터페이스입니다. 내가 올바르게 기억한다면 AVR은 Jtag를 사용하거나 적어도 일부는 Jtag를 사용합니다. 어느 쪽이든, 이것은 프로그램 메모리에 정보를 쓰려면 프로그래밍 핀을 흔들어주는 외부 하드웨어가 필요합니다. 프로그램 메모리 내용을 설명하는 HEX 파일은 범용 컴퓨터에서 시작되므로이 하드웨어는 한쪽의 컴퓨터에 연결되고 다른 쪽의 마이크로의 특수 프로그래밍 핀에 연결됩니다. 우리 회사는 PIC 프로그래머를 부업으로 만들기 때문에 PIC에 대한이 프로세스에 매우 익숙합니다.

특수 하드웨어를 통한 외부 프로그래밍의 중요한 점은 기존 프로그램 메모리 내용에 관계없이 작동한다는 것입니다. 마이크로 컨트롤러는 프로그램 메모리가 지워지거나 알 수없는 상태로 시작되므로 외부 프로그래밍이 첫 번째 프로그램을 마이크로로 만드는 유일한 수단입니다.

제품에로드하려는 프로그램이 확실하고 볼륨이 충분히 높은 경우 제조업체 또는 배포자 프로그램 칩을 보유 할 수 있습니다. 칩은 다른 칩과 마찬가지로 보드에 납땜되어 장치를 사용할 수 있습니다. 예를 들어 장난감과 같은 것에 적합 할 수 있습니다. 펌웨어가 완료되면 거의 완료되며 대량으로 생성됩니다.

볼륨이 낮거나 더 중요한 경우 지속적인 펌웨어 개발 및 버그 수정이 예상되는 경우 사전 프로그래밍 된 칩을 구매하고 싶지 않습니다. 이 경우 블랭크 칩이 보드에 장착되고 생산 공정의 일환으로 펌웨어가 칩에로드되어야합니다. 이 경우 어떻게 든 하드웨어 프로그래밍 라인을 사용할 수 있어야합니다. 프로덕션 테스트 픽스처를 기꺼이 만들려는 경우 명시 적 커넥터 또는 포고 핀 패드를 통해 가능합니다. 이러한 제품은 종종 테스트를 거쳐 교정되어야하므로 프로그램을 프로세서에 쓰는 데 드는 추가 비용은 일반적으로 최소화됩니다. 소형 프로세서를 사용하는 경우 특수 생산 테스트 펌웨어가 먼저 프로세서에로드됩니다. 이는 장치의 테스트 및 교정을 용이하게하는 데 사용됩니다. 하드웨어가 양호하다고 알려진 후에 실제 펌웨어가로드됩니다. 이 경우 프로그래밍 프로세스가 작동하기에 충분한 프로그래밍 라인에 대한 액세스를 허용하지만 회로에 너무 많은 불편을주지 않기 위해 일부 회로 설계 고려 사항이 있습니다. 이에 대한 자세한 내용은 내회로 내 프로그래밍 쓰기.

지금까지는 좋았으며 부트 로더가 필요하지 않습니다. 그러나 현장에서 업그레이드하거나 최종 고객이 업그레이드 할 수있는 비교적 복잡한 펌웨어의 제품을 고려하십시오. 최종 고객이 프로그래머 가제트를 갖기를 기대하거나 제공 한 경우에도 올바르게 사용하는 방법을 알 수 없습니다. 실제로 내 고객 중 하나가이 작업을 수행합니다. 특수 필드 커스터마이징 옵션을 구입하면 제품을 보유한 프로그래머 중 한 명을 얻게됩니다.

그러나 대부분의 경우 고객은 PC에서 프로그램을 실행하고 펌웨어를 마술처럼 업데이트하기를 원합니다. 특히 제품에 USB, RS-232 또는 이더넷과 같은 PC와 쉽게 인터페이스 할 수있는 통신 포트가있는 경우 부트 로더가 제공됩니다. 고객은 이미 마이크로에있는 부트 로더와 통신하는 PC 프로그램을 실행합니다. 이것은 새로운 바이너리를 부트 로더에 보내고, 이것은 프로그램 메모리에 쓴 다음 새로운 코드를 실행시킵니다.

간단하게 들리지만 적어도이 프로세스를 강력하게하려는 것은 아닙니다. 통신 오류가 발생하고 새 펌웨어가 부트 로더에 도착할 때까지 손상되면 어떻게합니까? 부팅 과정에서 전원이 차단되면 어떻게됩니까? 부트 로더에 버그와 크랩이 있으면 어떻게됩니까?

간단한 시나리오는 부트 로더가 항상 재설정에서 실행되는 것입니다. 호스트와 통신을 시도합니다. 호스트가 응답하면 부트 로더에 새로운 것이 없다는 것을 알리거나 새 코드를 보냅니다. 새 코드가 도착하면 이전 코드를 덮어 씁니다. 항상 업로드 된 코드와 함께 체크섬을 포함하므로 부트 로더는 새 앱이 손상되지 않았는지 알 수 있습니다. 그렇지 않은 경우 유효한 체크섬을 가진 항목이 메모리에로드 될 때까지 부트 로더에 지속적으로 업로드를 요청합니다. 이것은 항상 연결되어 있고 부트 로더 요청에 응답하는 호스트에서 백그라운드 작업이 실행되는 장치에 적합 할 수 있습니다. 이 체계는 대체로 자율적으로 호스트 컴퓨터에 연결되는 장치에는 적합하지 않습니다.

페일 세이프가 없기 때문에 일반적으로 위에서 설명한 단순 부트 로더는 허용되지 않습니다. 새 앱 이미지가 그대로 수신되지 않으면 장치가 이전 이미지를 계속 실행하고 업로드가 성공적으로 수행 될 때까지 죽지 않도록하려고합니다. 이러한 이유로 일반적으로 펌웨어에는 업 로더와 부트 로더의 두 가지 특수 모듈이 있습니다. 업 로더는 기본 앱의 일부입니다. 호스트와의 정기적 인 통신의 일환으로 새로운 앱 이미지를 업로드 할 수 있습니다. 이를 위해서는 외부 EEPROM과 같은 기본 앱 이미지와 별도의 메모리가 필요하거나 더 큰 프로세서를 사용하므로 프로그램 메모리 공간의 절반을 새 앱 이미지 저장에 할당 할 수 있습니다. 업 로더는 수신 한 새 앱 이미지를 어딘가에 쓰지만 실행하지는 않습니다. 업로드 후 호스트의 명령에 따라 프로세서가 재설정되면, 부트 로더가 실행됩니다. 이 프로그램은 이제 외부 통신 기능이 필요없는 완전히 독립적 인 프로그램입니다. 현재 및 업로드 된 앱 버전을 비교하고, 체크섬을 확인하고, 버전이 다르고 새 이미지 체크섬을 확인하면 새 이미지를 앱 영역에 복사합니다. 새 이미지가 손상되면 이전과 같이 이전 앱을 실행합니다.

나는 많은 부트 로더를 해왔으며 두 개가 동일하지 않습니다. 일부 마이크로 컨트롤러 회사가 여러분이 믿고 싶어하는 것에도 불구하고 범용 부트 로더는 없습니다. 모든 장치에는 호스트를 처리 할 때 고유 한 요구 사항과 특수한 환경이 있습니다. 다음은 내가 사용한 부트 로더 및 업 로더 구성 중 일부입니다.

  1. 기본 부트 로더. 이 장치에는 직렬 회선이 있으며 호스트에 연결되어 필요에 따라 켜집니다. 부트 로더가 재설정에서 실행되어 몇 개의 업로드 요청 응답을 호스트에 보냈습니다. 업로드 프로그램이 실행 중이면 응답하여 새 앱 이미지를 보냅니다. 500ms 이내에 응답하지 않으면 부트 로더가 기존 앱을 포기하고 실행합니다. 따라서 펌웨어를 업데이트하려면 먼저 호스트에서 업데이터 앱을 실행 한 다음 장치를 연결하고 전원을 켜야합니다.

  2. 프로그램 메모리 업 로더. 여기서는 프로그램 메모리의 두 배인 다음 크기의 PIC를 사용했습니다. 프로그램 메모리는 대략 49 % 기본 앱, 49 % 새 앱 이미지 및 2 % 부트 로더로 나뉩니다. 부트 로더는 재설정에서 실행되고 올바른 조건에서 새 앱 이미지를 현재 앱 이미지에 복사합니다.

  3. 외부 EEPROM 이미지. 외부 EEPROM을 사용하여 새 앱 이미지를 저장한다는 점을 제외하고 # 2와 유사합니다. 이 경우 더 많은 메모리를 가진 프로세서는 물리적으로 더 커졌으며 필요한 주변 장치가없는 다른 하위 제품군에있을 것입니다.

  4. TCP 부트 로더. 이것은 그들 중 가장 복잡한 것이었다. 큰 PIC 18F가 사용되었습니다. 메모리의 마지막 1/4 정도는 부트 로더를 보유하고 있으며, TCP 로더는 자체의 완전한 TCP 네트워크 스택 사본을 가지고있었습니다. 부트 로더가 재설정에서 실행되어 이전에 구성된 IP 주소의 알려진 포트에서 특수 업로드 서버에 연결하려고했습니다. 이는 전체 시스템에 항상 전용 서버 시스템이있는 대규모 설치를위한 것입니다. 각 소형 기기는 재설정 후 업로드 서버에 체크인하며 적절한 새 앱 사본이 제공됩니다. 부트 로더는 기존 앱을 새 복사본으로 덮어 쓰지만 체크섬이 선택된 경우에만 실행합니다. 그렇지 않으면 업로드 서버로 돌아가서 다시 시도하십시오.

    부트 로더 자체는 완전한 TCP 네트워크 스택을 포함하는 복잡한 코드이므로 현장 업그레이드도 가능했습니다. 그것들은 업로드 서버가 부트 로더를 실행 한 후에 덮어 쓰는 것이 유일한 목적 인 특수 응용 프로그램을 피드 서버에 공급하도록하고 새로운 부트 로더가 실행되도록 업로드 서버가 서버를 전송하도록하는 것이 었습니다. 최신 기본 앱 이미지. 기술적으로 몇 밀리 초 동안 파워 글리치 (boot glitch)는 부트 로더를 통해 새로운 이미지를 복사하기 위해 특별한 앱을 만드는 데 실패했습니다. 실제로 이것은 결코 일어나지 않았습니다. 우리는 이러한 장치가 이미 시스템에서 유지 관리를 할 사람들이 있었던 대규모 설치의 일부이기 때문에 가능성이 거의 없었습니다. 이는 때로는 다른 이유로 임베디드 장치를 교체하는 것을 의미했습니다.

바라건대 당신은 각각 다른 위험, 속도, 비용, 사용 용이성, 가동 중지 시간 등과 같은 자체 트레이드 오프가있는 여러 가지 가능성이 있음을 알 수 있습니다.


1
Xmega 제품군 (새로운 2 와이어 인터페이스 포함)을 제외한 모든 AVR은 재설정 된 상태에서 SPI 인터페이스를 사용합니다. 더 큰 것에는 JTAG가 있고, 더 큰 것에는 병렬 프로그래밍이 있으며, 더 작은 것에는 리셋이 I / O로 재구성 된 경우 고전압이 필요할 수 있습니다. Parallax Propeller 및 Motorola / Freescale 68HC08 제품군과 같은 일부 MCU에는 최소한의 프로그래밍 하드웨어가 아니라 ROM에 부트 로더가 있습니다.
Yann Vernier

현재 및 업로드 된 앱 버전을 비교하고, 체크섬을 확인하고, 버전이 다르고 새 이미지 체크섬을 확인하면 새 이미지를 앱 영역에 복사합니다. 예. 그러나이 작업 도중 전원이 차단되면 "앱 영역"에 손상된 이미지가있을 수 있습니다. mcu 플래시에 새 응용 프로그램을 작성하는 bootloader-failsafe-app를 사용하는 것이 더 좋을 수도 있고 체크섬이 유효하면 "새 응용 프로그램을 부팅 할 수있는 위치"도 작성합니다. 따라서 시작시 새 앱을 부팅해도 괜찮은지 확인합니다. 계속 실행되지 않으면 (
실패한

@Erv : 새 버전을 현재 버전으로 복사하는 도중 전원 공급이 중단되면 전원이 다시 공급되고 부트 로더가 다시 실행될 때 현재 버전 체크섬이 실패합니다. 나는 일반적으로 체크섬 단어를 이미지의 맨 끝에 두어 부분 쓰기가 체크섬 실패의 가능성을 크게 높입니다.
Olin Lathrop

안녕하세요. TCP 스택 대신 부트 로더 유형 5를 권장 할 수 있습니다 .UDP를 구현할 수 있습니다. 그런 다음 TFTP를 사용하여 업데이트 또는 기본 프로토콜을 다운로드하십시오.
i486

22

부트 로더의 개념은 무엇입니까?

이 시나리오 그림 : 마이크로 컨트롤러에는 상당한 양의 스토리지가 있으며, 서로 독립적 인 2-3 개 이상의 프로그램 또는 애플리케이션을 저장할 수 있습니다. 장치를 부팅 할 때 실행할 장치를 선택할 수 있다고 가정하십시오. 그렇다면 이것을 어떻게 지원해야합니까? 부팅시 다른 프로그램 중에서 선택할 수있는 시작 프로그램이 필요합니다.

어떻게 작동합니까?

부트 로더는 그 프로그램입니다.-가장 먼저 실행되며 다른 응용 프로그램을 메모리의 특정 위치 (FLASH와 같은 영구 또는 RAM과 같은 휘발성)에로드 한 다음 원하는 프로그램으로 건너 뛰어 거기서 실행을 이어받을 수 있습니다 .

avr 부트 로더를 만드는 방법 (또는 모든 마이크로 컨트롤러 용)?

나는 결코 부트 로더를 만들지 않았지만 이것이 내가 할 것이라고 생각하는 방법입니다 : 평소와 같이 펌웨어 프로그램 작성을 시작하십시오-그러나 그것이 항상 가장 먼저 실행되도록 영역에 배치하십시오 장치가 부팅됩니다. 내 작은 머리에서,이 작은 프로그램에서 내가 원하는 기능 중 일부 : 메모리의 사용 가능한 자리에 새 프로그램을 업로드하고, 이전에 업로드 한 프로그램을 지우고, 실행할 프로그램을 선택하십시오. 하나), 다른 프로그램의 위치를 ​​기억하고 그 위치로 이동할 수있는 일종의 스토리지 데이터 구조 (확장 가능한 점프 테이블?)가 있습니다. 매우 간단한 터미널 메뉴를 제공하고 동일한 채널을 통해 펌웨어를 업로드 할 수있는 UART를 통해 상호 작용을 수행 할 수 있습니다.

마이크로 컨트롤러에 어떻게 프로그래밍됩니까 (avr의 플래시 ROM에 구운 .hex 프로그램 또는 다른 방법)?

자체적으로 업데이트 할 수있는 기존 부트 로더가없는 완전 빈 칩인 경우이를 수행하는 데 필요한 기술 (AVR의 경우 ICSP)을 사용하여 설명한 것처럼 FLASH에 레코딩해야합니다.

이것은 결코 "부트 로더"가 무엇인지 포괄적이지 않습니다 . 하나 또는 원하는 시스템에서 원하는 것에 따라 FLASH 대신 RAM의 지정된 위치에 물건을 업로드하고 임의의 메모리 위치에서 실행을 시작할 수 있습니다. 또는 PC 부팅시로드 할 운영 체제를 선택할 수있는 운영 체제를 원할 수도 있습니다 ( 예 : grub 참조 ). 8 비트 마이크로 컨트롤러 용 부트 로더는 매우 간단한 경향이 있습니다.

Arduino에 대한 참고 사항 :이 부트 로더는 하나의 프로그램 AFAIK 만 관리하며 직렬 포트를 사용하여 펌웨어 업로드 및 기타 작업관리 합니다.


참고로, 현재 수정 된 원래 글 머리 기호를 해결하기 위해 답변이 작성되었습니다.
Jon L

3

"부팅"로더의 개념은 펌프의 "프라이밍"개념과 유사합니다. 다시 말해, 주어진 주소로 프로그램을로드 한 다음 해당 주소에서 프로그램을 실행하는 "무언가"가 필요합니다. 그게 바로 부트 로더입니다. 가장 간단한 경우, 부트 로더는 CPU의 지정된 시작 주소에 "나타나고"(0, 가장 가능성이 높음) 프로그램을 필요한 메모리 세그먼트에로드하고 제어를 전송하고 "사라집니다". 외관과 소멸은 "외부"하드웨어에 의해 제어됩니다. 한 가지 가능한 구현은 "하드웨어"재설정을 통해 활성화되고 "소프트웨어"재설정으로 비활성화되는 ROM을 사용하는 것입니다. ROM의 로더는 필요한만큼 간단하거나 복잡 할 수 있습니다. 특정 CPU가 이해하는 이진 형식으로 작성해야합니다. ROM이 사용하는 주소 공간이 필요하지 않으면 ROM을 비활성화 할 필요가 없습니다. 분명히 ROM 대신 EEPROM, ePROM, 플래시 PROM 등을 사용할 수 있습니다.

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