EP&C News UPDATED. 2017.11.20 월 17:11

상단여백
HOME EM OPINION 칼럼
MCU의 부트로더 제작방법
정환용 기자 | 승인 2017.09.11 11:31

[EPNC=정환용 기자] MCU(Micro-Controller Unit)에서의 부트로더(Bootloader)는 실제 애플리케이션 동작 전에 애플리케이션 업데이트, 동작 준비과정 등의 수행을 위해 구현해야 한다. 일반적으로 부트로더는 MCU의 동작 중 가장 먼저 동작해서 메모리의 시작 부분에 위치를 하게된다. MCU 제어의 준비과정과 실행할 애플리케이션의 이상 유무 확인 후 애플리케이션으로 점프해 MCU에서 애플리케이션 코드를 수행한다.

부트로더는 애플리케이션 시작전 동작함으로 주로 애플리케이션의 업데이트의 기능 동작으로 이용된다. 예를 들어, MCU의 펌웨어의 업데이트를 외부의 USB와 같은 통신 포트를 이용해 진행하거나 인터넷을 이용한 펌웨어의 업데이트 또한 할 수 있다. 제품의 사용 편의성과 유지보수성의 향상을 위한 부트로더를 만드는 방법을 간단한 예제와 함께 알아보자.

[그림 1]

코어텍스-M 기반 디바이스의 부트로더 만들기
IAR Embedded Workbench for ARM을 이용해 부트로더를 작성하는 방법에 대해 살펴본다. 부트로더 작성 관련한 예제는 코어텍스-M 코어 기반으로한 ST의 STM32L152VB 디바이스를 이용해 작성된 예제다.

우선 부트로더가 IAR Embedded Workbench for ARM에서 작성되는 순서는 다음과 같다.

① Bootloader, Application 프로젝트를 각각 생성
   (Project > Create New Project)
분리된 프로젝트는 같은 워크스페이스에서 관리될 수 있다. 참고로 프로젝트간 코드와 라이브러리 함수는 프로젝트 간 공유되지 않는다.

[그림 2]

② 메모리 영역을 분리한다.
Flash 영역에 부트로더와 애플리케이션이 위치할 영역을 구분하고 각각의 프로젝트에서 메모리 위치 설정을 변경한다. 벡터테이블 주소, Flash(ROM) 영역의 시작, 끝 주소를 구분된 영역에 맞게 변경한다.
메모리위치 설정은 [그림 3]과 같이 Project option à Linker à Config à Linker configuration fileà Edit를 통해 할 수 있으며, .icf 파일(Linker configuration file)을 편집기로 열어 수정할 수도 있다. 

[그림 3]
[그림 4]

③ 하드웨어의 초기화 과정은 일반적으로 부트로더에서 수행되며 최초 1회만 진행되도록 한다. 애플리케이션에서 다시 하드웨어를 초기화 하는 것은 필요하지 않다

④ 부트로더에서  애플리케이션으로 이동하기전 반드시 수행해야하는 과정은 다음과 같다.
▲인터럽트 비활성화 – 애플리케이션의 시작코드 수행 중 인터럽트 발생을 막는다. ▲스택 포인터의 재설정 – 부트로더가 아닌 애플리케이션의  스택 주소 위치로 변경한다. ▲VTOR 레지스터 설정 – 애플리케이션에서 동작 중 발생하는 인터럽트 처리를 위해 기존 부트로더의 벡터 테이블의 위치를 애플리케이션의 위치로 변경한다. ▲애플리케이션의 시작 코드를 실행한다.

 

부트로더와 애플리케이션을 동시 다운로드
부트로더와 애플리케이션을 Flash에 각각 따로 다운로드할 수 있지만 링커(Linker)의 설정으로 하나의 이미지로 만들어 동시에 다운로드할 수 있다. 다음의 예로 부트로더의 프로젝트에서 링커가 애플리케이션의 바이너리를 합쳐 하나의 이미지를 만들도록 하는 옵션 설정이다. Project Options àLinker à Input 항목에 다음과 같이 설정한다.

.icf(Linker Configuration File)에서 애플리케이션을 애플리케이션의 시작위치에 위치하도록 다음의 설정 코드를 추가한다.

[그림 5]

부트로더를 포함한 디버깅
부트로더와 애플리케이션을 동시에 디버깅할 수 있다. [그림 6]과 같이 Project  Options à Debugger à Images 항목의 설정으로 외부 ELF 파일 포멧의 파일(.out)에서 디버깅 정보를 해당 프로젝트에 불러올 수 있다

[그림 6]
[그림 7]

이 경우 부트로더와 애플리케이션 동일한 이름의 main 함수가 있어 C-SPY 디버거 시작에 main까지 이동 되지 않아 프로그램 시작위치부터 실행코드를 디버깅한다. 따라서, ‘Run to main‘ 옵션은 체크 해제 한다. ‘Run to main‘ 옵션이 체크 되어있더라도 부트로더의 main까지 이동되지는 않는다. 

또한, 다운로드 후 C-SPY 디버거 시작에서 부트로더와 애플리케이션에 동일한 이름의 심볼 ‘__vector_table’이  중복돼 [그림 8]과 같은 경고창이 나타 날 수 있다. 

[그림 8]

해당 경고창이 나타나지 않게 하려면 C-SPY 디버거가 벡터 테이블 위치를 인식할 수 있도록 다음의 옵션사항을 추가한다. Project OptionsDebugger à Extra Options란에 다음을 추가한다.

[그림 9]

또한,  디버깅 중 View à Images 창을 띄우면 현재 로드돼있는 이미지들을 확인할 수 있으며 부트로더와 애플리케이션간의 심볼 이름의 중복을 피하기 위해 현재 디버깅 중인 이미지만을 선택할 수 있다. 

작성: 이현도 IAR Systems Korea 기술지원팀 과장

#MCU#부트로더#IAR

정환용 기자  hyjeong@epnc.co.kr

<저작권자 © EP&C News, 무단 전재 및 재배포 금지>

정환용 기자의 다른기사 보기
icon인기기사
PREV NEXT
여백
여백
여백
여백
여백
여백
여백
icon
여백
여백
여백
여백
신제품
여백
여백
여백
여백
여백
Back to Top