RAM에 라이브러리 배치
기술노트 200401
아키텍처:
Arm, RH850, RISC-V, RL78, RX, STM8, SuperH
컴포넌트:
linker
업데이트:
2021-06-27 오전 6:50
소개
본 기술 노트는 라이브러리를 RAM에 배치하는 방법에 대해 설명합니다.
논의
TN_200401.zip 에서 예제 프로젝트를 다운로드하고 엽니다(프로젝트는 IAR Embedded Workbench for Arm 8.42.2 로 빌드되었습니다).
예제 (TN_200401.zip
)는 두 개의 프로젝트를 포함합니다.
- Simplelib - 전역 배열과 배열에서 부터 값을 반환하는 함수를 포함한 라이브러리 파일(
simplelib.a
)을 빌드합니다. - Place Lib in RAM - RAM에 라이브러리를 배치하고 라이브러리 함수를 실행하는 데모 프로젝트 입니다.
RAM에 라이브러리(simplelib.a
)를 배치하기 위해, 다음의 단계를 수행합니다:
- 라이브러리 코드를 위해 RAM의 주소 범위를 정의합니다.
define symbol region_RAM_CODE_start = 0x08010000; define symbol region_RAM_CODE_end = 0x0801FFFF;
- 라이브러리 코드를 위한 region을 정의합니다.
define region RAM_CODE_region = mem:[from region_RAM_CODE_start to region_RAM_CODE_end];
- 라이브러리 코드에 대한 블록(RAM에 배치됨)을 정의합니다. 섹션 선택 지시어는 라이브러리에서 코드 내용을 수집하고 섹션 속성 readwrite는 링커에 RAM에서 실행되는 코드로 연결하도록 지시합니다.
define block LIB {readwrite code object simplelib.a};
- 라이브러리에서 Initializer 바이트에 대한 블록(ROM에 배치됨)을 정의합니다. 섹션 선택 지시어는 라이브러리에서 _init 섹션(코드 내용)을 모두 수집합니다.
define block LIB_INIT {readonly code section *_init object simplelib.a};
-
initialize by copy 지시어는 링커에게 ROM에서 RAM으로 복사를 가능하게 하는 *_init 섹션 (라이브러리에서 코드 내용을 포함하는)을 생성하도록 지시합니다. 그리고 코드 내용을 블록 LIB_INIT에서 블록 LIB로 복사하는 startup 코드를 위해 정렬을 수행합니다.
initialize by copy { readonly object simplelib.a };
- place in 지시어는 RAM에 라이브러리 코드를 위한 블록을 배치하도록 링커에 지시합니다.
place in RAM_CODE_region { block LIB };
- place in 지시어는 ROM에 라이브러리의 initializer 바이트 (코드 내용)을 배치하도록 링커에게 지시합니다.
place in ROM_region { block LIB_INIT };
결론
RAM에 라이브러리를 배치하려면 라이브러리의 영역을 RAM에 정의하고, 블록 LIB
를 정의 및 배치하고, 블록 LIB_INIT
를 정의하여 ROM에 배치하고, 마지막으로 ROM에서 RAM으로 복사될 startup 라이브러리의 코드 내용을 정렬합니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.