Cortex-M 에 부트로더 생성하기
기술노트 160822
아키텍처:
ARM
컴포넌트:
general
업데이트:
2021-07-15 오후 9:53
소개
이 기술 노트에서는 IAR Embedded Workbench for ARM을 사용하여 부팅 로더를 생성하는 방법에 대한 지침을 제공합니다. 기술 노트의 대부분의 권장 사항은 일반적이지만, 예시 프로젝트는 Cortex-M 마이크로프로세서(특히 STMicroelectronics STM32L152VB)에 대한 것입니다.
논의
부트 로더를 생성할 때 프로젝트 설정 및 부트 로더에서 애플리케이션으로 실행 핸드오버와 관련하여 고려해야 할 몇 가지 사항이 있습니다. STM32L152VB에 대한 프로젝트 예제를 참조하고 아래 고려 사항을 따르십시오. 이 기술 노트에서는 애플리케이션의 "실시간 업데이트"(IAP – 애플리케이션 프로그래밍에서)를 수행하는 방법이나 통신 인터페이스를 구성하는 방법은 설명하지 않습니다(부트로더의 일반적인 기능입니다).
일반적인 고려사항
- 부팅 로더용과 애플리케이션용으로 각각 다른 프로젝트를 만듭니다. 두 프로젝트를 동일한 작업 공간에 배치할 수 있습니다. 프로젝트를 별도로 유지하면 코드 및 라이브러리 기능이 부트 로더와 응용 프로그램 간에 공유되지 않도록 할 수 있습니다.
- 플래시 메모리 블록 크기(플래시 메모리 중 가장 작은 소거 장치)를 확인합니다. 부트 로더와 응용 프로그램 간의 구분은 플래시 블록 경계에 있어야 합니다. 그렇지 않으면 응용 프로그램 또는 부트 로더를 교체할 때 응용 프로그램 또는 부트 로더의 일부를 지울 위험이 있습니다.
- 모든 하드웨어 초기화는 일반적으로 부팅 로더가 한 번만 수행해야 합니다. 원하는 하드웨어가 아니면 응용 프로그램이 하드웨어를 다시 초기화하지 않는지 확인하십시오.
- 부트 로더가 애플리케이션으로 실행을 넘겨주기 전에 다음 사항을 확인하십시오:
- 인터럽트 사용 안 함 - 응용 프로그램을 시작하는 동안 예기치 않은 인터럽트를 방지합니다.
- 스택 포인터를 구성/재설정 - 애플리케이션의 스택 메모리가 부트 로더에서 이미 사용되지 않도록 합니다.
- VTOR 레지스터를 구성하여 부팅 로더가 아닌 애플리케이션에서 인터럽트를 처리합니다.
디버깅시 고려사항
부트 로더와 응용 프로그램을 동시에 디버깅하는 것은 가능하지만, 둘 다 main 함수을 포함하고 있기 때문에 까다로울 수 있다. 디버거가 두 응용 프로그램을 인식하도록 하려면, Project > Options > Debugger > Images를 선택하여 다른 프로젝트의 ELF 출력 파일에서 디버그 정보를 로드합니다.
실행할 main 함수 (부트로더의 main 함수 또는 응용 프로그램의 main 함수)에 대한 혼동을 방지하기 위해 Debugger Setup 페이지에서 Run to:main 옵션이 비활성화되었는지 확인합니다.
또한 <module>\<function> 구문을 사용하여 디버거에서 실행할 주 함수를 정확히 알 수 있습니다. 기술노트 45813을 참조하십시오. 이 예에서는 Run to:bootloader_main\main을 사용할 수 있습니다.
다운로드 후 디버거는 기본적으로 __vector_table이라는 기호에 지정된 주소에서 실행을 시작합니다. 부트 로더와 응용 프로그램을 동시에 디버그하면 다음 메시지가 표시될 수 있습니다.
디버거를 올바른 __vector_table 기호로 안내하려면 부트 로더의 벡터 테이블이 있는 위치를 명시적으로 지정할 수 있습니다. Project > Options > Debugger > Extra Options을 선택하고 다음을 지정합니다:
--drv_vector_table_base=0x08000000
디버깅할 때 두 응용 프로그램에서 충돌하는 기호 이름의 문제를 방지하려면 View(보기) > Images(이미지) 윈도우를 사용하여 현재 범위 내에 있는 응용 프로그램을 선택합니다.
부트 로더에서 애플리케이션으로 실제 점프를 진행하는 경우 이미지 창에서 현재 로드된 디버그 정보를 변경해야 합니다.
플래시 쓰기시 고려사항
애플리케이션 및 부트 로더를 플래시 메모리로 다운로드하려면 여러 가지 대안이 있습니다. 부트 로더와 응용 프로그램은 별도의 프로젝트에 배치되므로 각 프로젝트에서 개별적으로 다운로드할 수 있습니다. 대안으로, 예를 들어 링커를 사용하여 애플리케이션 바이너리를 부트 로더 프로젝트에 포함(또는 그 반대)하여 두 가지 모두를 플래시 메모리에 동시에 다운로드할 수 있습니다. 이 작업을 수행하려면 Project > Options > Linker > Input을 선택합니다.
링커 구성 파일에서 애플리케이션 바이너리는 다음과 같이 플래시 메모리에 배치됩니다:
place at address mem: app_vector { readonly section .APP };
자세한 내용은 프로젝트 예제를 참조하십시오. 프로젝트는 C-SPY 시뮬레이터 드라이버를 사용하거나 I-젯을 사용하여 STM32 표적 장치에서 테스트할 수 있습니다.
제한사항
이 기술 노트의 세부 정보는 VTOR 레지스터가 있는 Cortex-M 코어에 적용됩니다.
- Cortex-M3(이상)에는 VTOR 레지스터가 있습니다.
- VTOR 레지스터는 Cortex-M0+ 및 Cortex-M23에서 선택 가능하므로 장치 설명서를 참조하여 칩 공급업체에 VTOR이 포함되어 있는지 확인하십시오.
- 사용 중인 코어가 Cortex-M0 또는 Cortex-M1인 경우 VTOR 레지스터가 없기 때문에 VTOR과 관련된 이 기술 노트의 부분은 적용되지 않습니다.
결론
부트 로더를 생성할 때는 프로젝트 구조와 실제 부트 로더에서 애플리케이션으로 이동하는 것과 관련된 몇 가지 사항을 고려해야 합니다. 이 기술 노트는 IAR Embedded Workbench for ARM을 사용하여 부팅 로더를 생성하기 위한 일반적인 지침으로 사용되는 것을 목표로 합니다. 디버거 창, 옵션 및 __vector_table 기호에 대한 자세한 내용을 보려면 Help > C-SPY Debugging Guide를 선택하십시오. 응용 프로그램에서 플래시 메모리에 쓰는 방법에 대한 예를 보려면 특정 장치에 대한 Help > Information Center > Example Projects를 선택하십시오.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.