닫기

테크노트

배너

[기고] 특정 메모리에 함수·데이터 고정시키는 방법

  • 등록 2019.02.12 10:49:21
URL복사
[마감임박!! 무료] 생성형AI, 디지털트원, 제조AI, SaaS, 클라우드로 생산성 높이고, 비용절감 방안 제시.. AI자율제조혁신포럼 개최 (3/27~29, 코엑스3층 컨퍼런스룸 317~318호)

[첨단 헬로티]


임베디드시스템의 소프트웨어를 개발할 때 함수 또는 변수를 특정 위치에 위치시켜야만 하는 경우가 많다. 기능 구현을 위해 함수가 특정 위치에 고정시키거나 저장된 코드의 유효성을 확인하기 위한 이유로 코드나 변수를 특정 위치에 고정시킨다.


이러한 경우 개발도구의 기능을 최대한 활용하면 좀 더 쉽고 효율적으로 메모리관리가 가능하다. IAR 임베디드 워크벤치(IAREmbedded Workbench)는 다양한 방법으로 함수 또는 데이터를 특정 메모리 위치에 위치시킬 수 있다. 본 글에서는 메모리를 가장 효율적으로 사용하는 방법을 설명하겠다. 


변수를 특정 메모리 위치로 지정하기

변수를 특정 메모리에 위치시키기 위해 @ 키워드와 #pragma location 명령을 사용한다. 해당 키워드, 명령으로 전역변수, Static 변수를 절대 주소로 위치를 고정할 수 있다. 우선 @ 키워드를 사용하는 방법은 간단하다. 다음의 예처럼 변수 선언문에 @ (address or section) 형태로 키워드를 추가하면 된다. 


(@ 명령 다음 “메모리 섹션” 형태의 구문도 사용 가능하다)

빌드 후 Linker map 파일에서 변수가 배치된 위치를 확인할 수 있다.


다른 방법으로 사용자 지정의 메모리섹션을 특정 위치에 정의 후 정의된 메모리 섹션에 #pragma location 명령을 이용해 변수를 위치시킬 수 있다. 우선 링커설정파일 .icf 파일 내 사용자 지정의 메모리 섹션을 특정 위치에 정의한다. 다음의 예와 같이 링커설정파일에 명령을 추가한다.


그 다음 전역변수, Static 변수 선언문의 바로 전 라인에 #pragma location 명령을 추가한다. 빌드 후 Linker map 파일에서 정의된 섹션과 변수의 배치된 주소를 확인할 수 있다.

 


만일 하나의 변수가 아닌 여러 변수를 동시에 특정 메모리 위치로 고정하는 방법은 #pragma default_variable_attributes 명령을 사용한다. 특정 메모리 위치로 고정하기 위한 변수 선언문 앞 라인에서 #pragma default_variable_attributes = “(섹션이름)” 명령을 추가하고 마지막 변수 다음 라인에서 #pragma default_variable_attributes = 명령을 추가해라. 다음 예를 참고하라. 

빌드 후 Linker map 파일에서 변수의 배치된 주소를 확인할 수 있다.


변수를 특정 위치에 지정하는 경우 __no_init 키워드도 같이 활용할 수 있다. 특정 레지스터에 데이터를 할당하거나 외부에서 참조/변형되는 데이터인 경우 유용하게 사용된다. __no_init 키워드는 변수 선언문 앞에 사용하며 해당 변수를 추기화하지 말라는 의미로 사용된다.


소스 코드 추가 없이 Object의 모든 변수를 

특정 메모리 위치로 지정하기

이번 변수 위치 변경의 방법은 IAR 임베디드 워크벤치에서 지원하는 키워드, 명령을 사용하는 방법이다. 따라서 소스코드에 명령이나 키워드를 추가 후 다시 빌드해야한다. 컴파일된 Object가 포함하는 모든 변수를 특정 메모리 섹션에 위치시킬 수 있다. 간단한 방법으로 링커설정 파일 (.icf) 에 Object의 변수(ReadWrite data) 배치 위치를 특정 위치에 고정시키는 명령을 추가한다. 다음 예를 참고하라.  

빌드 후 Linker map 파일을 확인하면 test.o에 정의된 전역변수(ReadWrite Data)는 모두 특정 위치로 고정된 것을 확인할 수 있다. 

함수를 특정 메모리 위치로 지정하기

함수의 위치 또한 변수를 특정 위치로 고정하는 방법과 동일한 방법으로 위치를 고정할 수 있다. 동일하게 @ 키워드와 #pragma location 명령을 사용한다. @ 키워드 사용 방법으로 우선 링커설정파일 .icf 파일 내 사용자 지정의 메모리 섹션을 특정 위치에 정의한다. 다음의 예와 같이 링커설정파일에 명령을 추가한다.

다음 함수선언문 또는 함수 원형에 @ (section) 키워드를 추가해 위치를 변경한다. 

또는 함수 원형에 키워드를 추가해도 동일 효과가 있다.

(@ 명령 다음 절대 주소위치 형태의 구문은 함수에 사용 불가능하다.)

빌드 후 Linker map 파일에서 함수가 배치된 위치를 확인할 수 있다.


다른 방법으로 사용자 지정의 메모리 섹션에 #pragma location 명령을 이용해 함수를 위치시킬 수 있다. 변수의 방법과 동일하다. 다음 예를 참고하라.

 

또는 함수원형에 명령을 사용한다. 


빌드 후 Linker map 파일에서 함수가 배치된 위치를 확인할 수 있다.


함수를 RAM으로 배치하기

함수의 수행속도 향상 또는 기능상의 이유로 함수의 위치를 ROM의 위치가 아닌 RAM으로 배치해야하는 경우가 있다. 이러한 경우 가장 간단한 방법은 __ramfunc 키워드를 사용하는 방법이다. 함수의 선언문 또는 함수의 원형앞에 __ramfunc 키워드를 삽입한다. 다음의 예를 참조하라.


또는 함수 원형에 키워드를 추가한다.


빌드 후 Linker map 파일에서 함수가 배치된 위치를 확인할 수 있다. 해당 함수는 ReadOnly의 속성이 아닌 ReadWrite 속성을 갖기에 기존 코드(.text)와는 다른 메모리 섹션(.textrw)에 할당한다. 

또는 하나의 함수마다 __ramfunc 키워드를 추가하는 방법 외 코드의 추가 없이 특정 소스파일의 모든 함수를 RAM으로 배치할 수 있다. 이 경우에는 링커 설정 파일에서 initialize by copy라는 키워드를 사용한다. 초기화된 변수의 초기화를 수행 할 경우에 사용하는 것으로, 함수를 ROM에서 RAM으로 복사하는 초기화 할 때에도 사용할 수 있다. 우선 test.c 에 구현된 함수들은 다음과 같이 선언돼 있다.


다음 링커설정 파일에서 initialize by copy 명령에 test.o의 코드를 RAM 상으로 초기화 하도록 추가한다.

 

빌드 후 Linker map 파일에서 test.c에 포함된 함수들이 모두 RAM으로 배치된 것을 확인할 수 있다.


맺음말

다양한 이유로 함수나 변수를 특정한 위치에 고정하게 되는데, 앞의 열거된 방법의 조합으로 다양하게 응용 가능하다. IAR 임베디드 워크벤치에서 지원하는 다양한 키워드나 컴파일, 빌드 명령을 잘 활용하면 보다 쉽게 기능을 구현할 수 있다.


작성자 : 이현도 IAR 시스템즈(IAR Systems) 기술지원팀 과장(Hyun-Do.Lee@iar.com)










배너









주요파트너/추천기업