| |||
| Home > 스캐터 로딩 설명 파일 사용 > 스캐터 로딩 설명 파일의 형식적 구문 > 스캐터 로딩 파일의 식 평가 | |||
스캐터 파일에는 식으로 지정된 숫자 상수가 포함된 경우가 많습니다. 링커에서는 식을 매개 변수로 사용하는 ScatterAssert라는
어설션 함수도 제공합니다. 이 식이 true로 평가되지 않는 경우 오류 메시지가 생성됩니다. 자세한 내용은 ScatterAssert 함수를 참조하십시오.
다음 위치에 식을 사용할 수 있습니다.
로드 및 실행 영역 base_address
로드 및 실행 영역 +offset
로드 및 실행 영역 max_size
ALIGN, FILL 또는 PADVALUE 키워드의
매개 변수
ScatterAssert 함수의 매개 변수
식은 C 우선 순위 규칙을 따르고 다음으로 구성되어 있습니다.
10진수 또는 16진수
산술 연산자: +, -, /, *, ~, OR 및 AND
OR 및 AND 연산자는 각각 C 연산자
| 및 &에 매핑됩니다.
논리 연산자: LOR, LAND 및 !
LOR 및 LAND 연산자는 각각 C
연산자 || 및 &&에 매핑됩니다.
관계 연산자: <, <=, >, >= 및 ==
식이 false로 평가되면 0이 반환되고 true로 평가되면 0이 아닌 값이 반환됩니다.
조건부 연산자: Expression ? Expression1 : Expression2
이 연산자는 C 조건부 연산자와 일치합니다. 이
0이 아닌 값으로 평가되면 Expression이
평가되고, 그렇지 않으면 Expression1가
평가됩니다.Expression2
숫자를 반환하는 함수. 자세한 내용은 기본 제공 함수를 참조하십시오.
의미와 우선 순위 측면에서 모든 연산자는 해당 C 연산자와 일치합니다.
식은 대소문자를 구분하지 않으며 명확성을 위해 괄호를 사용할 수 있습니다.
실행 주소 관련 함수는 또는 base_address+ 값을
지정할 때만 사용할 수 있으며, Table 5.2에
나와 있는 링커 정의 심볼의 조합으로 매핑됩니다.offset
Table 5.2. 실행 주소 관련 함수
| 함수 | 링커 정의 심볼 값 |
|---|---|
ImageBase( |
Image$$ |
ImageLength( |
Image$$ |
ImageLimit( | Image$$region_name$$Base + Image$$region_name$$Length + Image$$region_name$$ZI$$Length |
영역 관련 링커 심볼에 대한 자세한 내용은 Table 4.1을 참조하십시오.
매개
변수는 로드 또는 실행 영역 이름일 수 있습니다. 정방향 참조는 허용되지 않습니다. region_name은 Example 5.4이미 정의된 로드 또는
실행 영역만 참조할 수 있습니다.region_name
ScatterAssert( 함수는
최상위 수준에서나 로드 영역 안에서 사용할 수 있습니다. 이 함수는 링크가 완료된 후 평가되며 expression)이
false로 평가되면 오류 메시지를 생성합니다. Example 5.7에서는 expressionScatterAssert 함수를
사용하여 영역의 로
허용되는 것보다 복잡한 크기 검사를 작성하는 방법을 보여 줍니다.max_size
로드 주소 관련 함수는 ScatterAssert 함수 안에서만 사용할
수 있으며, Table 5.3에 나와 있는
세 가지 링커 정의 심볼 값으로 매핑됩니다.
Table 5.3. 로드 주소 관련 함수
| 함수 | 링커 정의 심볼 값 |
|---|---|
LoadBase( |
Load$$ |
LoadLength( |
Load$$ |
LoadLimit( |
Load$$ |
매개
변수는 로드 또는 실행 영역 이름일 수 있습니다. 정방향 참조는 허용되지 않습니다. region_name은
이미 정의된 로드 또는 실행 영역만 참조할 수 있습니다.region_name
심볼 관련 함수 defined(은 global_symbol_name)이
정의되지 않았으면 0을 반환하고 정의되어 있으면 0이 아닌 값을 반환합니다.global_symbol_name
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 스캐터
로딩 키워드를 사용하면 ER2 및 ER3의 로드
주소와 실행 주소가 정렬됩니다.
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