특정 섹션에 함수 또는 변수 그룹 배치하기

기술노트 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 위치를 사용하는 것보다 더 편리한 방법은 기능을 별도의 소스 파일에 넣고 링크에서 지시문을 사용하여 개체 파일에서 모든 기능을 선택하도록 하는 것입니다.

다음 단계를 수행:

  1. 함수를 하나 이상의 소스 파일에 수집합니다.
  2. 이전에 사용한 #pragma location 지시어를 모두 제거합니다.
  3. .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 제목 아래의 내용을 참고하시기 바랍니다.

 

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

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