5.3.3. 고정 주소에 영역 배치

실행 영역 스캐터 로딩 설명 파일에서 FIXED 특성을 사용하여 고정 주소에서 로드 및 실행되는 루트 영역을 만들 수 있습니다.

FIXED는 단일 로드 영역(따라서 일반적으로 단일한 ROM 장치) 안에 여러 루트 영역을 만드는 데 사용됩니다. 예를 들어, 포인터를 통해 쉽게 액세스할 수 있도록 ROM의 고정 주소에서 함수 또는 상수 테이블이나 체크섬과 같은 데이터 블록을 배치하는 데 사용할 수 있습니다.

예를 들어, 일부 초기화 코드가 ROM 시작 부분에, 체크섬은 ROM의 끝 부분에 배치되도록 지정하면 메모리 내용 중 일부는 사용하지 못할 수 있습니다. * 또는 .ANY 모듈 선택기를 사용하여 초기화 블록의 끝과 데이터 블록의 시작 사이 영역을 가득 채우십시오.

Note

코드 유지 관리와 디버그를 쉽게 하려면 스캐터 로딩 설명 파일에서 최소량의 배치 사양을 사용하고 자세한 함수 및 데이터의 배치는 링커에 둡니다.

부분적으로 링크된 구성요소 오브젝트는 지정할 수 없습니다. 예를 들어, obj1.o, obj2.oobj3.o를 함께 부분적으로 링크하여 obj_all.o를 생성하면 결과적인 구성요소 오브젝트 이름은 결과 오브젝트에서 폐기됩니다. 그러므로 예를 들면 obj1.o와 같은 이름으로 오브젝트 중 하나를 참조할 수 없습니다. 결합된 오브젝트 obj_all.o만 참조할 수 있습니다.

특정 주소에 함수 및 데이터 배치

일반적으로, 컴파일러는 단일 소스 파일에서 RO, RW 및 ZI 섹션을 생성합니다. 이러한 영역에는 소스 파일의 모든 코드와 데이터가 포함됩니다. 고정 주소에 단일 함수 또는 데이터 항목을 배치하려면 링커가 나머지 입력 파일과 별도로 함수 또는 데이터를 처리할 수 있도록 해야 합니다. 개별 오브젝트에 액세스하려면 다음과 같이 할 수 있습니다.

  • 자체 소스 파일에 함수 또는 데이터 항목을 배치합니다.

  • --split_sections 컴파일러 옵션을 사용하여 각 함수의 오브젝트 파일을 생성합니다. 자세한 내용은 RealView Compilation Tools 버전 3.0 컴파일러 및 라이브러리 설명서를 참조하십시오.

    이 옵션을 지정하면 함수 간에 주소, 데이터 및 문자열 리터럴을 공유할 가능성이 줄어들기 때문에 코드 크기가 약간(대개 몇 퍼센트 정도) 더 커질 수 있습니다. 그러나 이렇게 하면 armlink --remove를 지정할 때 링커에서 사용하지 않는 함수를 제거할 수 있게 되어 최종 이미지의 전체 크기를 줄이는 데 도움이 됩니다.

  • C 또는 C++ 소스 코드 안에서 #pragma arm section을 사용하여 여러 이름의 섹션을 만듭니다. 자세한 내용은 Example 5.5를 참조하십시오.

  • 어셈블리 언어의 AREA 지시문을 사용합니다. 어셈블리 코드의 경우, 가장 작은 배치 가능 단위는 AREA입니다. 자세한 내용은 RealView Compilation Tools 버전 3.0 핵심 설명서를 참조하십시오.

개별 오브젝트 파일의 내용 배치

Example 5.4의 스캐터 로딩 설명 파일은 다음을 배치합니다.

  • 0x0 주소의 초기화 코드(뒤에는 나머지 RO 코드와 data.o 오브젝트의 RO 데이터를 제외한 모든 RO 데이터가 옴)

  • 0x400000에 있는 RAM의 모든 전역 RW 변수

  • 0x1FF00 주소에 고정된 data.oRO-DATA 테이블

Example 5.4. 섹션 배치

LOADREG1 0x0 0x10000
{
    EXECREG1 0x0 0x2000           ; Root Region, containing init code
    {                             ; place init code at exactly 0x0
        init.o (Init, +FIRST)  
        * (+RO)                   ; rest of code and read-only data  
    }
    RAM  0x400000                 ; RW & ZI data to be placed at 0x400000
    {
        * (+RW, +ZI)
    }
    DATABLOCK 0x1FF00 FIXED 0xFF  ; execution region fixed at 0x1FF00
    {                             ; maximum space available for table is 0xFF
        data.o(+RO-DATA)          ; place RO data between 0x1FF00 and 0x1FFFF
    }
}

Note

FIXED 및 단일 로드 영역의 사용이 적절하지 않은 일부 상황이 있습니다. 고정 위치 지정을 위한 다른 기술은 다음과 같습니다.

  • 로더가 여러 로드 영역을 처리할 수 있는 경우 RO 코드 또는 데이터를 자체 로드 영역에 배치하십시오.

  • 함수 또는 데이터가 ROM의 고정 주소에 있어야 할 필요가 없으면 FIXED 대신 ABSOLUTE를 사용하십시오. 그러면 로더가 로드 영역에서 RAM의 지정된 주소로 데이터를 복사합니다. (ABSOLUTE는 기본 특성입니다.)

  • 메모리 매핑된 I/O 위치에 데이터 구조를 배치하려면 두 개 로드 영역을 사용하고 UNINIT를 지정합니다. (UNINIT는 메모리 위치가 0으로 초기화되지 않도록 합니다.) 자세한 내용은 RealView Compilation Tools 버전 3.0 개발자 설명서에서 임베디드 소프트웨어 개발 방법에 대해 설명하는 장을 참조하십시오.

arm 섹션 pragma 사용

자체 소스 파일에 코드 또는 데이터 오브젝트를 배치한 다음 오브젝트 파일 섹션을 배치할 경우 표준 코딩 기술을 사용합니다. 그러나 pragma 및 스캐터 로딩 설명 파일을 사용하여 명명된 섹션을 배치할 수도 있습니다. 모듈을 만들고(예를 들어, adder.c) Example 5.5에 표시된 대로 명시적으로 섹션을 명명합니다.

Example 5.5. 섹션 명명

// file adder.c
    int x1 = 5;                      // in .data
    int y1[100];                     // in .bss
    int const z1[3] = {1,2,3};       // in .constdata
    int sub1(int x) {return x-1;}    // in .text

    #pragma arm section rwdata = "foo", code ="foo"
    int x2 = 5;                      // in foo (data part of region)
    char *s3 = "abc";                // s3 in foo, "abc" in .constdata
    int add1(int x)  {return x+1;}   // in foo (.text part of region)
    #pragma arm section code, rwdata // return to default placement

명명된 섹션이 배치되는 곳을 지정하려면 스캐터 로딩 설명 파일을 사용합니다. 자세한 내용은 Example 5.6을 참조하십시오. 코드와 데이터 섹션 모두 이름이 동일하면 코드 섹션이 먼저 배치됩니다.

Example 5.6. 섹션 배치

FLASH 0x24000000 0x4000000
{
    FLASH 0x24000000 0x4000000
    {
        init.o (Init, +First)          ; place area Init from init.o first
        * (+RO)                        ; sub1(), z1[]
    }
    32bitRAM 0x0000
    {
        vectors.o (Vect, +First)
        * (+RW,+ZI)                    ; x1, y1   
    }
    ADDER 0x08000000
    {
        adder.o (foo)                  ; x2, string s3, and add1()
    }
}
Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0206GK
Non-Confidential