RAM에서 전체 프로그램을 다운로드 및 실행(Cortex-M3)

기술노트 73964

아키텍처:

ARM

컴포넌트:

general

업데이트:

2021-05-25 오전 4:37

소개

RAM에서 전체 프로그램을 실행할 필요가 있는 경우.

제약

이 제안은 C-SPY 디버거로 다운로드를 할 때에만 적용됩니다.

RAM 단독환경으로 실행해야 할 경우 본 기술 노트 11578를 참고하세요.

논의

배경지식:

다음은 전체 프로그램을 RAM에 배치하고, 예측하는 대로 RAM에서 실행하는 데 필요한 과정입니다.

  • 데이터 (읽기/쓰기 및 상수)와 코드가 RAM에 연결되도록 변경합니다.
  • Vector 테이블을 RAM에 배치합니다. (최소한 Cortex-M 설계에 의해 강제된 정렬을 사용하여)
  • C-start-up 도중, VTOR을 Vector 테이블의 주소로 설정합니다.

제안하는 해결방안:

여러가지 해결방안이 있습니다. 다음의 제안은 한가지 가능성일 뿐입니다.

코드와 데이터를 RAM에 배치한다.

  • "edit" 버튼으로 (또는 .icf 파일이 있는 폴더로 이동하여) Project > Options > Linker > Config 에서 "Linker configuration file editor" 창을 엽니다.
  • "memory regions" 페이지로 이동합니다.
    • RAM/start 에서 값을 복사하여 ROM/start로 값을 붙여넣습니다.
    • 그리고 RAM/end 에서 값을 복사하여 ROM/end 로 값을 붙여 넣습니다.

코드와 데이터 그리고 Vector 테이블이 RAM에 위치하였는지 확인한다.

프로젝트를 빌드합니다.

  • Vector 테이블(__vector_table이라는 기호이름)이 RAM에 위치했는지, 주소가 2^7로 정렬되었는지 확인합니다. (.map 파일 상에)
  • 변경사항이 있다면 Project > Options > Linker > Config > Vector table 페이지로 이동합니다.
    • 램에서의 주소가 2^7로 정렬되도록 변경한다. (0x20000000 주소 사용을 권장)

VTOR RAM 설정

Vector 테이블(__vector_table 기호이름)을 위해 RAM 상의 위치를 가리킬 수 있도록 VTOR("Vector Table Offset Register")를 변경한다.

  • \arm\src\lib\low_level_init.c 을 복사한 뒤 프로젝트에 복사본을 추가한다. (파일의 쓰기보호write protection을 해제해야 할 수 있습니다.)
  • 사용중인 장비를 위한 #include 구문을 추가합니다. (VTOR레지스터의 정의를 담고 있는 헤더파일(.h)의 참조를 얻기 위함입니다.)
  • Vector 테이블을 위한 ... extern int __vector_table[]; ... 선언문을 추가합니다.
  • __low_level_init 함수 내에 __vector_table의 주소로 VTOR를 설정합니다. 다음과 같이 지정할 수 있습니다:
VTOR = (unsigned int) & __vector_table;

VTOR가 정확히 설정되었는지 테스트.

  • 수정된 프로젝트를 빌드 한다.
  • 시뮬레이터로 다운로드 한다.
    • RAM 상의 Vector 테이블의 주소로 VTOR가 설정되었는지 확인
  • 시뮬레이터에서 하드웨어 디버거 드라이버로 변경한다.
  • 프로그램을 RAM으로 다운로드한 뒤 거기서 실행한다.

예제 프로젝트

아래 링크를 통해 STM32F103ZE을 위한 예제 프로젝트를 다운로드할 수 있습니다.

Example STM32F103ZE.zip

 

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

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