부트로더란?
부트로더(bootloader)는 부팅 시 처음으로 실행되는 프로그램으로 Application을 로드하고 실행하는데 필요한 초기 설정을 한다. 부트로더는 주로 ROM, flash 메모리 또는 EEPROM에 저장되어 있으며, 기본적으로는 기기를 켜면서부터 실행된다. Application 업데이트가 필요한 경우 사용될 수 있다.
부트로더를 이해하기 위한 예시
1. 아두이노
아두이노의 경우에도 flash memory 에 프로그램된 on chip bootloader 가 있다.
아두이노가 reset 되는 경우 bootloader 가 가장 먼저 실행된다. bootloader 는 아두이노 스케치를 보드에 다운로드하기 위한 목적으로 사용된다. (IAP, In Application Programming)
아두이노 보드를 PC에 연결하고, PC에서 아두이노 프로그램을 열고 코드를 작성 후 업로드 버튼을 누르는데 그 때, 보드는 순간 reset에 들어가고 bootloader 가 즉시 실행되어 아두이노 프로그램으로부터의 커맨드를 기다린다. 그리고 나서 코드를 binary 형식으로 받아서 MCU의 flash 메모리에 프로그램하는 과정이 이어진다. 이후 또 다시 reset 되어 방금 프로그램된 application의 주소로 점프한다.
2. STM32F429ZI Nucleo 144
이 MCU의 경우에도 on chip Bootloader 가 있다.
다만 MCU가 reset 되는 경우 Bootloader 가 디폴트로 실행되지는 않는다. Reset 시 Bootloader 가 실행되게끔 하기 위해서는 boot pin 설정을 해주어야 한다. (이 경우 필드에서 케이스를 까서 boot pin 설정을하고 다운로드하기 어려울 수 있다.)
그리고 이 보드의 경우에는 ST Link 라고 부르는 In-Circuit Debugger/Programmer 가 있기 때문에, 이 보드에 프로그램할 때 bootloader에 도움을 받을 필요가 없다. 또한 ST Link 를 사용하여 코드 실행중 디버그도 가능하다. 이런 경우를 ISP(In-System Programming)이라고 부른다. 아두이노에는 In-Circuit Programmer가 없었기 때문에 flash에 binary 프로그램을 쓰는데 bootloader의 도움이 필요했던 것이다.
정리하자면 사용자 코드를 플래시 메모리에 넣는 방법은 크게 두가지로 나뉠 수 있다.
1. ST-Link, JTAG 등 디버깅 장비를 사용해 굽는 방법
2. 부트로더를 사용하는 방법
그리고 부트로더를 사용하는 방법은 또 나뉘어질 수 있다.
2-1. 내장 부트로더 사용
2-2. 커스텀 부트로더 사용
내장 부트로더는 공장 출하시 on chip 프로그램된 자체 플래시 부트로더를 이용하는 방법이다. 부트로더를 만들 수고는 덜 수 있지만 boot pin 설정을 해야할 수 있고 특정 uart 채널로만 가능할 수 있으며 칩 제조사에서 제공하는 flash programmer.exe 를 사용해야 하는 제한 조건이 있을 수 있다. 반면 커스텀 부트로더를 만들면 더욱 유연하게 사용이 가능하다.
부트로더의 기능
- boot 기능 : 펌웨어를 실행하기 위한 최소한의 초기화, 부팅 디바이스(Flash memory, SD카드 등) 선택
- loader 기능 : 펌웨어를 실행할 메모리에 Load 또는 펌웨어가 있는 메모리로 Jump해서 실행
- update 기능 : 펌웨어 업데이트 (via 통신, SD카드 등)
부트로더가 필요하지 않은 경우
반드시 필요한 것은 아니며 아래의 경우에는 필요없을 수도 있다.
- 펌웨어가 업데이트될 필요가 없는 제품
- 필드에서 혹은 소비자가 직접 펌웨어를 업데이트 할 필요 없는 경우
- 별도 부트로더가 필요없는 MCU : STM32 포함 대부분의 MCU는 별도 부트코드 필요없이 특정 툴을 사용해 내장 Flash Memory 에 Wirte하면 바로 실행 가능
✔ 부트로더는 꼭 직접 만들 필요는 없고, MCU에 내장된 부트로더를 사용하던지 제조사에서 제공하는 샘플 코드를 사용할 수 있다.
부트로더 추가 시 단점
- 부트로더 구현을 위한 별도 메모리 공간 필요
- 생산시 부트로더 다운로드 공정이 추가됨
- 부트로더 자체는 업데이트가 어려움 (필드에서 소비자가 업데이트 할 수 없고 회수해야 함)
부트로더 적용시 메모리 구조
부트로더는 반드시 리셋 시 처음 실행되는 위치에 있어야하며 부트로더에서 펌웨어의 스타트업 코드로 점프해서 실행하게 된다.
부트로더를 추가하면 메모리 구조가 변경 되기 때문에 링커 스크립트 파일을 수정하여 펌웨어의 시작 위치와 인터럽트 벡터의 주소를 변경해야 한다.
부트로더 직접 만들 경우 필요한 것
- 부트로더 펌웨어 : FLASH 제어 및 통신 기능
- 통신 프로토콜
- PC용 다운로드 프로그램
출처 및 참고 :
https://www.youtube.com/watch?v=HsHJp_IP_ns
https://blog.naver.com/nextstone/222882217869
FastBit Embedded Brain Academy Udemy
'임베디드 개발 > 펌웨어' 카테고리의 다른 글
Serial EEPROM 과 NAND Flash Memory(USB, SD) 의 비교 (0) | 2023.02.03 |
---|---|
메모리 종류와 세부분류 ROM, RAM, FLASH (2) | 2023.02.03 |
LSB, MSB (0) | 2023.01.31 |
CAN 통신 - 메시지 타입과 구조 (0) | 2023.01.26 |
CAN 통신 (Controller Area Network) (1) | 2023.01.24 |