특정 섹션에 함수 또는 변수 그룹 배치하기
기술노트 27498
아키텍처:
ARM
컴포넌트:
linker
업데이트:
2021-06-25 오후 12:39
소개
본 기술 노트는 각각의 #pragma
location 지시어를 사용하지 않고, 여러 함수와 변수들을 특정 섹션에 배치하는 두 가지 방법에 대해 기술합니다.
논의
한 함수 (또는 변수)는 #pragma
location를 사용하여 지정된 섹션에 배치할 수 있습니다:
#pragma location="MY_FUNC"
void f(void);
반면, #pragma
location를 사용하는 것은 많은 함수 (또는 변수)들을 배치할 경우에는 실용적이지 않습니다.
다음 방법에 대해 설명합니다:
• 여러 함수/변수 들을 단 한 개의 pragma 지시어를 사용하여 배치하는 방법
• 오브젝트 파일에서 여러 함수를 링커 배치 지시어를 사용하여 배치하는 방법
여러 함수/변수 들을 단 한 개의 pragma 지시어를 사용하여 배치하는 방법
함수/변수의 선언 및 정의에 대한 기본 배치 및 속성을 설정하는 데 사용할 수 있는 두 가지 pragma 지시어가 있습니다.
• #pragma default_variable_attributes
• #pragma default_function_attributes
두 가지 pragma 지시어를 사용하면 여러 #pragma
location 지시어를 사용하는 대신 여러 선언 및 정의에 대해 단일 #pragma
지시어를 사용할 수 있습니다.
pragma 지시어를 사용하는 예시
소스 코드에서 MY_FUNC
섹션에 일부 함수 배치하기.
#pragma default_function_attributes = @ "MY_FUNC"
int fun1(int x)
{
return x + 1;
}
int fun2(int x)
{
return x - 1;
}
/* Stop placing functions in section MY_FUNC */
#pragma default_function_attributes =
int fun3(int x)
{
return x + x;
}
/* Place following data in section MY_DATA */
#pragma default_variable_attributes = @ "MY_DATA"
int data1;
int data2;
/* Stop placing data in section MY_DATA */
#pragma default_variable_attributes =
int data3;
int main()
{
data1 = fun1(5);
data2 = fun2(5);
data3 = fun3(5);
return data1 + data2 + data3;
}
모든 데이터를 MY_DATA 섹션의 지정된 메모리 주소 범위에 배치하려면 링크 설정 파일(.icf)에 다음 줄을 추가하십시오:
define region DATA_region = mem:[from 0x20000000 to 0x20001FFF ];
place in DATA_region { readwrite section MY_DATA };
다음 줄을 링크 설정 파일에 추가하여 모든 코드를 MY_FUNC
섹션의 지정된 메모리 주소 범위에 배치합니다:
define region FUNC_region = mem:[ from 0x70000 to 0x70FFF ];
place in FUNC_region { readonly section MY_FUNC };
오브젝트 파일에서 여러 함수를 링커 배치 지시어를 사용하여 배치하는 방법
여러 #pragma 위치를 사용하는 것보다 더 편리한 방법은 기능을 별도의 소스 파일에 넣고 링크에서 지시문을 사용하여 개체 파일에서 모든 기능을 선택하도록 하는 것입니다.
다음 단계를 수행:
- 함수를 하나 이상의 소스 파일에 수집합니다.
- 이전에 사용한
#pragma
location 지시어를 모두 제거합니다. - .icf 파일을 편집하고 아래 예시된 키워드 오브젝트를 포함하는 지시문을 추가합니다.
링크 설정 파일에 다음 줄을 추가하여 원본 파일Utilities.c
의 모든 코드를 지정된 메모리 주소 범위에 배치하십시오.
define region UTILITIES_region = mem:[ from 0x71000 to 0x71FFF ];
place in UTILITIES_region { readonly object Utilities.o };
결론
지정된 메모리 주소 범위에 데이터/코드를 배치하기 위해 여러 #pragma
location 지시어를 사용할 필요는 없습니다. 대신 위에서 설명한 방법을 사용할 수 있습니다.
링커 배치 지시어place in에 대한 자세한 정보는 IAR C/C++ Development Guide 에서 Section-selectors 제목 아래의 내용을 참고하시기 바랍니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.