티스토리 뷰
일반적인 의미에서 bootloader라고 하는 것은 컴퓨터나 임베디스 시스템이 처음 기동할 때 기본적인 하드웨어의 동작을 검사 한 후, 이상이 없으면 하드디스크나 플래쉬메모리에서 OS 커널을 RAM으로 복사하여 OS가 시작되도록 하는 작은 프로그램을 의미한다.
하지만, AVR에서 말하는 bootloader는 위에서 설명한 의미 보다는 아이폰이나 안드로이드폰과 같은 단말기의 OS를 업데이트하는 개념과 비슷하다.
즉, 특별한 장비없이 ROM 파일을 변경할 수 있는 셀프 프로그램이라고 보면된다.
AVR의 bootloader 프로그램을 개발하기 위해서는 몇가지 읽어야 할 문서들이 있다.
AVR(ATmega328) datasheet 문서중에 "Boot Loader Support – Read-While-Write Self-Programming"
AVR109: Self Programming
AVR911: AVR Open Source Programmer
avr-libc-user-manual
AVR의 Program memory 영역은 아래 그림처럼 두개의 영역으로 나누어져 있다.
AVR에서 동작되는 프로그램들은 모두 Application Flash Section 영역에 위치하게 되며, CPU가 리셋상태에서 프로그램이 처음 시작될 때 항상 0번지에서부터 프로그램이 시작되도록 되어 있다.
이에 반해 AVR의 bootloader 프로그램은 Boot Flash Section에 위치한다. 그리고, 리셋상태에서 프로그램이 시작되면 0번지가 아닌, Boot Flash Section의 시작 주소에서부터 프로그램이 시작된다.
Bootloader가 먼저 실행이 되더라도 Application Section의 프로그램을 변경할 일이 없으면 즉각 0번지로 점프하여 평소처럼 Application 프로그램이 동작되도록 한다.
하지만 기존에 있던 application 프로그램을 업데이트 하거나, 새로운 프로그램으로 변경하고자 할 때에는 컴퓨터로부터 application 프로그램 파일을 로딩받아 application flash section을 새로운 실행파일로 변경시키는 동작을 수행한다.
컴퓨터에 있는 hex파일을 UART를 이용하여 로딩받기 때문에 ISP 장비없이도 application 프로그램을 변경할 수 있다.
AVR의 플래쉬메모리는 Page라고 하는 구역으로 이루어져 있다. 하나의 page 크기는 AVR마다 다르지만 32, 64, 128 word 크기를 가진다.
플래쉬메모리의 특성상 새로운 데이터를 플래쉬메모리에 기록하려면 반드시 page단위로 erase 시킨 후 page buffer에 새로운 데이터를 쓰고, 최종적으로 page buffer에 있는 값 전체를 erase한 플래쉬메모리 page로 옮기는 명령어를 수행하면 결과적으로 새로운 데이터로 업데이트 된다.
대부분 application 영역의 데이터를 업데이트 할 때 기존에 있는 값을 보존할 필요가 없으므로 필요한 영역을 모두 erase 한 후 새로운 데이터로 업데이트 하면 되지만, 만약 기존 데이터의 일부분만 변경하는 경우라면 반드시 page 단위로 메모리에 읽어 온 후 거기에서 데이터를 변경하고, 변경된 page 영역 전체를 다시 쓰는 동작을 수행하여야 기존 데이터를 유지 할 수 있다.
Bootloader 프로젝트는 AVR Open Source Programmer에 있는 절차를 참고하여 가급적 동일하게 구현하겠지만, 편의상 약간 다른 방법을 이용하여 구현하는 부분도 있다.
'프로젝트 > Bootloader' 카테고리의 다른 글
Bootloader - Flash memory write (3) | 2016.08.27 |
---|---|
Bootloader - Hex 파일 (8) | 2016.08.24 |
Bootloader - Device 정보 조회 (0) | 2016.08.19 |
Bootloader - Bootloader flash section에서 프로그램 시작 (0) | 2016.08.17 |
Bootloader - 사전 준비 (3) | 2016.08.15 |