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
주소 사용을 권장)
- 램에서의 주소가 2^7로 정렬되도록 변경한다. (
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을 위한 예제 프로젝트를 다운로드할 수 있습니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.