Cortex-M 에 부트로더 생성하기

기술노트 160822

아키텍처:

ARM

컴포넌트:

general

업데이트:

2021-07-15 오후 9:53

소개

이 기술 노트에서는 IAR Embedded Workbench for ARM을 사용하여 부팅 로더를 생성하는 방법에 대한 지침을 제공합니다. 기술 노트의 대부분의 권장 사항은 일반적이지만, 예시 프로젝트는 Cortex-M 마이크로프로세서(특히 STMicroelectronics STM32L152VB)에 대한 것입니다.

논의

부트 로더를 생성할 때 프로젝트 설정 및 부트 로더에서 애플리케이션으로 실행 핸드오버와 관련하여 고려해야 할 몇 가지 사항이 있습니다. STM32L152VB에 대한 프로젝트 예제를 참조하고 아래 고려 사항을 따르십시오. 이 기술 노트에서는 애플리케이션의 "실시간 업데이트"(IAP – 애플리케이션 프로그래밍에서)를 수행하는 방법이나 통신 인터페이스를 구성하는 방법은 설명하지 않습니다(부트로더의 일반적인 기능입니다).

일반적인 고려사항

  • 부팅 로더용과 애플리케이션용으로 각각 다른 프로젝트를 만듭니다. 두 프로젝트를 동일한 작업 공간에 배치할 수 있습니다. 프로젝트를 별도로 유지하면 코드 및 라이브러리 기능이 부트 로더와 응용 프로그램 간에 공유되지 않도록 할 수 있습니다.
    Workspace
  • 플래시 메모리 블록 크기(플래시 메모리 중 가장 작은 소거 장치)를 확인합니다. 부트 로더와 응용 프로그램 간의 구분은 플래시 블록 경계에 있어야 합니다. 그렇지 않으면 응용 프로그램 또는 부트 로더를 교체할 때 응용 프로그램 또는 부트 로더의 일부를 지울 위험이 있습니다.

  • 모든 하드웨어 초기화는 일반적으로 부팅 로더가 한 번만 수행해야 합니다. 원하는 하드웨어가 아니면 응용 프로그램이 하드웨어를 다시 초기화하지 않는지 확인하십시오.

  • 부트 로더가 애플리케이션으로 실행을 넘겨주기 전에 다음 사항을 확인하십시오:
  1. 인터럽트 사용 안 함 - 응용 프로그램을 시작하는 동안 예기치 않은 인터럽트를 방지합니다.
  2. 스택 포인터를 구성/재설정 - 애플리케이션의 스택 메모리가 부트 로더에서 이미 사용되지 않도록 합니다. 
  3. VTOR 레지스터를 구성하여 부팅 로더가 아닌 애플리케이션에서 인터럽트를 처리합니다.
    Example code

디버깅시 고려사항

부트 로더와 응용 프로그램을 동시에 디버깅하는 것은 가능하지만, 둘 다 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를 선택하십시오.

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

 

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.