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)를 배치하기 위해, 다음의 단계를 수행합니다:

  1. 라이브러리 코드를 위해 RAM의 주소 범위를 정의합니다.

    define symbol region_RAM_CODE_start = 0x08010000;
    define symbol region_RAM_CODE_end = 0x0801FFFF;​


  2. 라이브러리 코드를 위한 region을 정의합니다.

    define region RAM_CODE_region = mem:[from region_RAM_CODE_start to region_RAM_CODE_end];​


  3. 라이브러리 코드에 대한 블록(RAM에 배치됨)을 정의합니다. 섹션 선택 지시어는 라이브러리에서 코드 내용을 수집하고 섹션 속성 readwrite는 링커에 RAM에서 실행되는 코드로 연결하도록 지시합니다.

    define block LIB {readwrite code object simplelib.a};​


  4. 라이브러리에서 Initializer 바이트에 대한 블록(ROM에 배치됨)을 정의합니다. 섹션 선택 지시어는 라이브러리에서 _init 섹션(코드 내용)을 모두 수집합니다.

    define block LIB_INIT {readonly code section *_init object simplelib.a};​


  5. initialize by copy 지시어는 링커에게 ROM에서 RAM으로 복사를 가능하게 하는 *_init 섹션 (라이브러리에서 코드 내용을 포함하는)을 생성하도록 지시합니다. 그리고 코드 내용을 블록 LIB_INIT에서 블록 LIB로 복사하는 startup 코드를 위해 정렬을 수행합니다.



    initialize by copy { readonly object simplelib.a };​


  6. place in 지시어는 RAM에 라이브러리 코드를 위한 블록을 배치하도록 링커에 지시합니다.

    place in RAM_CODE_region { block LIB };​


  7. place in 지시어는 ROM에 라이브러리의 initializer 바이트 (코드 내용)을 배치하도록 링커에게 지시합니다.

    place in ROM_region { block LIB_INIT };​

결론

RAM에 라이브러리를 배치하려면 라이브러리의 영역을 RAM에 정의하고, 블록 LIB를 정의 및 배치하고, 블록 LIB_INIT를 정의하여 ROM에 배치하고, 마지막으로 ROM에서 RAM으로 복사될 startup 라이브러리의 코드 내용을 정렬합니다.

 

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

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