TASKING 링커 스크립트를 활용한 메모리 맵핑

TRACE32
이동: 둘러보기, 검색

TASKING 링커 스크립트를 활용한 메모리 맵핑

 

SW개발 시 flash나 ram 메모리를 효율적으로 사용하기 위해서 코드나 데이터를 어떻게 사용할 것인지 미리 계획하고 메모리 로케이션 룰을 링커를 통해 지정하게 된다.

이 문서에서는 AURIX TC277 target을 예제로 섹션들을 원하는 주소로 맵핑 하는 방법에 대해 소개한다.

 링커 스크립트 구조

TASKING 컴파일러에서 프로젝트 생성시 기본적으로 생성되는 링커 스크립트는 프로젝트명.lsl 로 생성된다. 또한 TASKING 설치 후 제공되는 링커 파일(TASKING 설치 경로\include.lsl)은 모듈화 되어 있어 프로젝트의 lsl파일에서 include하여 간단하게 사용할 수 있기 때문에 사용할 프로세서에 맞는 메모리 설정을 따로 하지 않아도 된다.

아래와 같이 프로젝트 생성시 선택 한 프로세서에 맞게 TASKING에서 제공하는 lsl파일을 include하고 있다.

                               <프로젝트 lsl파일에서 프로세서 lsl파일 include>

tc27x.lsl 파일에서는 프로세서에 맞는 코어, 메모리 맵, 주요 심볼의 주소, 버스 등을 지정 하고 있으며, 코어 specific한 내용의 경우 아래와 같이 따로 lsl파일로 제공되어 이를 include하여 사용한다.

 메모리 맵 변경

tc27x.lsl 파일에 보면 메모리 맵을 프로세서에 맞게 미리 지정이 되어 있다. 프로젝트의 properties->C/C++ Build->Memory 항목을 이용하면 프로세서의 메모리 구조를 아래 그림과 같이 쉽게 파악 할 수 있다.

Source : Memory 위치

Name : Memory 이름

Type : Memory type

Address : memory 시작 주소(cached address, not-cached address)

size : memory size

Priority : 메모리 로케이션 우선 순위

프로세서의 메모리 맵 구조를 변경하여 사용해야 하는 경우 위 GUI를 이용하거나 링커 스크립트 파일에서 직접 메모리 맵을 수정가능 하며, GUI에서 메모리 맵 수정 시 tc27x를 기반으로 한 my_tc27x로 수정 된 사항이 프로젝트의 링커 스크립트로 자동 반영이 된다.

위 스크립트 예제는 TASKING 에서 제공하는 기본 lsl파일에 설정된 onchip item들(메모리)을 프로젝트의 링커파일에서 메모리 재 지정 한 결과 이다. 이 링커 설정을 통해 pflash0메모리를 Boot_flash와 App_Flash공간으로 나누었다.

 

코드 섹션을 원하는 주소에 로케이션 하는 방법

위 에서 재 지정한 Boot_flash와 App_Flash 메모리에 원하는 함수를 각각 맵핑 하기 위해서 먼저 map파일에 생성된 함수의 섹션이름을 확인 해야 한다.

            <소스 파일>

 

                                            <map 파일>

 

생성된 섹션이름을 확인 후 링커 스크립트에 위 코드가 로케이션 될 위치를 지정 해 준다.

                                    <링커 파일>

section_layout <memory space> : memory space에 대한 섹션 레이아웃

mpe:vtc:linear : linear memory space로 모든 메모리 주소 공간에 접근 가능

group <그룹 명> : 섹션들을 포함하는 그룹명과 그룹 지정

ordered : 지정된 섹션을 순차적으로 메모리에 로케이션

contiguous : 지정된 섹션을 연속적으로 메모리에 로케이션

run_addr : 지정된 섹션이 동작될 주소

mem:<코어>:<메모리 주소> : 메모리->코어->메모리 주소 지정

[0x100] : 시작 주소부터 0x100 이후 주소

select “섹션명” : 그룹에 로케이션 할 섹션 지정

위와 같이 설정 후 빌드 하면 원하는 메모리에 함수가 로케이션 된 것을 확인 할 수 있다.

 

 데이터 섹션을 원하는 주소에 로케이션 하기

데이터를 로케이션 하는 룰을 만들기 위해서는 생성되는 data의 type에 대해서 먼저 파악해야 한다. 아래 표는 tricore에서 생성되는 데이터의 type정보이다.

                                              < data type에 따른 설명 >

data의 경우 초기화된 data이며, bss의 경우 초기화 되지 않는 데이터를 의미한다.

‘z’ 가 있는 섹션이름의 경우 near 데이터를 의미 하며 빠른 메모리 access가 필요한 데이터의 경우 near메모리 영역에 로케이션 하면 된다.

near 메모리 영역 : 4GB 주소 공간을 256MB로 나눈 첫 16k size 주소로 abs18 direct access 방식으로 메모리 접근한다.

far 메모리 영역 : 4GB 주소 공간 모두 접근 가능하며 indirect access방식으로 메모리를 접근한다

near data(.zbss, zdata, zrodata)의 경우 컴파일러의 옵션을 통해 위에서 언급한 near 메모리 영역으로 로케이션 되도록 설정 가능하며, 지정된 size 이하 크기의 데이터를 우선하여 near 메모리로 로케이션 되도록 threshold 값을 지정하는 방법을 사용한다.

아래는 near 메모리 로케이션 threshold를 지정하는 옵션 설정 방법이다.

                                                                             < near data 컴파일 옵션 설정 >

near data에 대한 기본 값은 8byte로 되어 있으며, 0으로 설정 시 near data는 생성되지 않는다.

데이터를 원하는 메모리에 로케이션 하기 위해 유의할 사항은 데이터 type에 따라서 사용되는 메모리 space가 다르며 링커 스크립트의 section layout 설정시에도 맞춰 주어야 한다. 아래 표는 데이터 타입에 따라 어떤 space를 사용하면 되는지 확인 할 수 있다.

                                                      < 데이터 type별 특징 >

아래는 초기화 되지 않는 데이터를 로케이션 하는 예제이다.

                      <소스 파일에서 데이터 선언>

 

                               <링커 스크립트에서 로케이션 룰 설정>

 

                                                                                 <map 파일에서 로케이션 결과 확인>

 

추가로 초기화된 데이터(.data, .rodata)타입의 경우 flash에도 함께 로케이션 되며, 초기화된 데이터의 값이 저장된다. 이 초기화 데이터가 부팅 과정에서 rom에서 ram으로 copy된다.

                                             < ram copy 데이터 섹션 >

위 캡쳐 화면을 보면 ram copy가 필요한 섹션의 경우 [ ]로 표시가 된다.

램과 마찬가지로 flash에 로케이션 되는 섹션도 로케이션 룰을 지정 할 수 있다.

                      < ram copy 데이터 섹션의 로케이션 주소 지정>

이 경우에는 run_addr속성 대신 load_addr 속성을 사용해야 한다.

                                                                                                < 로케이션 결과 >