5.2.8. 스캐터 로딩 파일의 식 평가

스캐터 파일에는 식으로 지정된 숫자 상수가 포함된 경우가 많습니다. 링커에서는 식을 매개 변수로 사용하는 ScatterAssert라는 어설션 함수도 제공합니다. 이 식이 true로 평가되지 않는 경우 오류 메시지가 생성됩니다. 자세한 내용은 ScatterAssert 함수를 참조하십시오.

식 사용

다음 위치에 식을 사용할 수 있습니다.

  • 로드 및 실행 영역 base_address

  • 로드 및 실행 영역 +offset

  • 로드 및 실행 영역 max_size

  • ALIGN, FILL 또는 PADVALUE 키워드의 매개 변수

  • ScatterAssert 함수의 매개 변수

식 규칙

식은 C 우선 순위 규칙을 따르고 다음으로 구성되어 있습니다.

  • 10진수 또는 16진수

  • 산술 연산자: +, -, /, *, ~, ORAND

    ORAND 연산자는 각각 C 연산자 | 및 &에 매핑됩니다.

  • 논리 연산자: LOR, LAND!

    LORLAND 연산자는 각각 C 연산자 || &&에 매핑됩니다.

  • 관계 연산자: <, <=, >, >===

    식이 false로 평가되면 0이 반환되고 true로 평가되면 0이 아닌 값이 반환됩니다.

  • 조건부 연산자: Expression ? Expression1 : Expression2

    이 연산자는 C 조건부 연산자와 일치합니다. Expression이 0이 아닌 값으로 평가되면 Expression1이 평가되고, 그렇지 않으면 Expression2가 평가됩니다.

  • 숫자를 반환하는 함수. 자세한 내용은 기본 제공 함수를 참조하십시오.

의미와 우선 순위 측면에서 모든 연산자는 해당 C 연산자와 일치합니다.

식은 대소문자를 구분하지 않으며 명확성을 위해 괄호를 사용할 수 있습니다.

기본 제공 함수

실행 주소 관련 함수는 base_address 또는 +offset 값을 지정할 때만 사용할 수 있으며, Table 5.2에 나와 있는 링커 정의 심볼의 조합으로 매핑됩니다.

Table 5.2. 실행 주소 관련 함수 

함수링커 정의 심볼 값
ImageBase(region_name)
Image$$region_name$$Base
ImageLength(region_name)
Image$$region_name$$Length + Image$$region_name$$ZI$$Length
ImageLimit(region_name)
Image$$region_name$$Base + Image$$region_name$$Length + Image$$region_name$$ZI$$Length

영역 관련 링커 심볼에 대한 자세한 내용은 Table 4.1을 참조하십시오.

region_name  매개 변수는 로드 또는 실행 영역 이름일 수 있습니다. 정방향 참조는 허용되지 않습니다. region_nameExample 5.4이미 정의된 로드 또는 실행 영역만 참조할 수 있습니다.

ScatterAssert 함수

ScatterAssert(expression) 함수는 최상위 수준에서나 로드 영역 안에서 사용할 수 있습니다. 이 함수는 링크가 완료된 후 평가되며 expression이 false로 평가되면 오류 메시지를 생성합니다. Example 5.7에서는 ScatterAssert 함수를 사용하여 영역의 max_size로 허용되는 것보다 복잡한 크기 검사를 작성하는 방법을 보여 줍니다.

로드 주소 관련 함수는 ScatterAssert 함수 안에서만 사용할 수 있으며, Table 5.3에 나와 있는 세 가지 링커 정의 심볼 값으로 매핑됩니다.

Table 5.3. 로드 주소 관련 함수 

함수링커 정의 심볼 값
LoadBase(region_name)
Load$$region_name$$Base
LoadLength(region_name)
Load$$region_name$$Length
LoadLimit(region_name)
Load$$region_name$$Limit

region_name 매개 변수는 로드 또는 실행 영역 이름일 수 있습니다. 정방향 참조는 허용되지 않습니다. region_name은 이미 정의된 로드 또는 실행 영역만 참조할 수 있습니다.

심볼 관련 함수

심볼 관련 함수 defined(global_symbol_name)global_symbol_name이 정의되지 않았으면 0을 반환하고 정의되어 있으면 0이 아닌 값을 반환합니다.

예제

Example 5.3. 식 측면에서 최대 크기 지정

LR1 0x8000 (2 * 1024)
{
    ER1 +0 (1 * 1024)
    {
        *(+RO)
    }
    ER2 +0 (1 * 1024)
    {
        *(+RW +ZI)
    }
}

Example 5.4. 실행 영역 차례로 배치

LR1 0x8000
{
    ER1 0x100000
    {
        *+RO
    }
}
LR2 0x100000
{
    ER2 (ImageLimit(ER1))               ; Place ER2 after ER1 has finished
    {
        *(+RW +ZI)
    }
}

Example 5.5. 심볼 존재 조건에 따라 기본 주소 지정

LR1 0x8000
{
    ER1 (defined(version1) ? 0x8000 : 0x10000)   ; Base address is 0x8000
                                                 ; if version1 is defined
                                                 ; 0x10000 if not
    {
        *(+RO)
    }
    ER2 +0
    {
        *(+RW +ZI)
    }
}

Example 5.6에서는 사전 처리기 매크로 및 식의 조합을 사용하여 페이지 경계에서 조밀하게 패킹된 실행 영역을 실행 주소에 복사합니다. ALIGN 스캐터 로딩 키워드를 사용하면 ER2ER3의 로드 주소와 실행 주소가 정렬됩니다.

Example 5.6. 실행 공간과 조밀하게 패킹된 로드 공간에서 기본 주소 정렬

#! armcc -E
#DEFINE START_ADDRESS  0x100000
#DEFINE PAGE_ALIGNMENT 0x100000

#DEFINE MY_ALIGN(address, alignment) ((address +
(alignment-1)) AND ~(alignment-1))

LR1 0x8000
{
    ER0 +0
    {
        *(InRoot$$Sections)
    }
    ER1 START_ADDRESS
    {
        file1.o(*)
    }
    ER2 MY_ALIGN(ImageLimit(ER1), PAGE_ALIGNMENT)
    {
        file2.o(*)
    }
    ER3 MY_ALIGN(ImageLimit(ER2), PAGE_ALIGNMENT)
    {
        file3.o(*)
    }
}

Example 5.7. ScatterAssert를 사용하여 여러 영역의 크기 검사

LR1 0x8000
{
    ER0 +0
    {
        *(+RO)
    }
    ER1 +0
    {
        file1.o(+RW)
    }
    ER2 +0
    {
        file2.o(+RW)
    }
    ScatterAssert((LoadLength(ER1) + LoadLength(ER2)) < 0x1000)
                                         ; LoadLength is compressed size
    ScatterAssert((ImageLength(ER1) + ImageLength(ER2)) < 0x2000)
                                         ; ImageLength is uncompressed size
}
ScatterAssert(ImageLength(LR1) < 0x3000) ; Check uncompressed size of LoadRegion
Copyright © 2002-2007 ARM Limited. All rights reserved.ARM DUI 0206HK
Non-Confidential