본문 바로가기

임베디드/ARM

ARM ToolChain 관련 문서

※ 본 포스팅은 armlink, armcc 사용자 가이드를 요약 및 번역한 것입니다. 오역이 있을 수 있으며, 댓글 남겨 주시면 수정하도록 하겠습니다. 문서 링크는 아래에 있습니다.


1. 읽어 볼만한 ARM ToolChain 문서 종류

- Armcc User Guide (ARM DUI 0375) : armcc 컴파일러의 특징을 설명

- ARM C and C++ Libraries and Floating-Point Support User Guide (ARM DUI 0378)

  : ARM C, C++ 라이브러리, ARM C microlib 특징을 설명.

- Armasm User Guide (ARM DUI 0379) : armasm, 어셈블러의 특징을 설명

- Armlink User Guide (ARM DUI 0377) : armlink, 링커의 특징을 설명

- Armar User Guide (ARM DUI 0590) : armar, 라이버리안(librarian)의 특징을 설명

- Fromelf User Guide (ARM DUI 0459) : fromelf, ELF 이미지 변환의 특징을 표사

 

각 문서가 설명하는 ARM Toolchain의 상관관계는 다음과 같다.

 

※ 용어

armcc : ARM and Thumb 컴파일러, 인라인과 임베디드 assemblers 지원

armasm :  ARM and Thumb어셈블러

armlink : 링커

armar : Libarian(?). ELF 오브젝트 파일들을 모아서(collect) 하나의 archives or libraries 로 유지 되게 한다. 


(이하 본인이 필요한 부분만 발췌)


1.4 - Armlink User Guide(ARM DUI 0377)

Chapter 7 Scatter-loading Features

7.1.1 Overview of scatter-loading

Scatter-loading은 메모리 영역이 메모리 맵에 복잡하게 로드 할때 문제를 쉽게 해결해 준다.

모든 메모리 맵은 다른 로드와 실행 주소(load and execution address)를 가진다.

 

이미지(image)의 메모리 맵을 건설(construct)하기 위해서는 링커는 다음 두가지를 가져야 한다

1. 입력 섹션출력 섹션으로 그룹화 되는 방법을 설명하는 그룹화 정보

2. (이미지가) 메모리 맵상 어떤 영역에 위치되야 하는지를 나타내는 위치 정보

 

링커가 .sct 파일을 이용하여 이미지를 만들 때, 링커는 영역과 관계된 심볼(region-related symbols)을 생성한다.

 

다시 말해, 링커는 오직 코드만 참고할 수 있는 특정 심볼을 만든다.

 

7.1.2 When to use scatter-loading

Scatter-loading은 ROM, RAM, 메모리 맵을 가지는 임베디드 시스템을 구현할 때 사용된다.

혹은

복잡한 메모리 맵을 가질 경우 - 코드와 데이터가 메모리의 구분되는 영역에 놓일 경우

다른 타입의 메모리(!) - flash, ROM, SDRAM, fast SRAM 등 다른 물리적 메모리를 가질 경우, Scatter-loading은 가장 적절한 메모리 타입을 선택할 수 있다(?)

예를들어, 인터럽트 코드의 경우 응답시간을 빠르게 하기 위해 fast SRAM에 배치하고, 덜 자주 사용되는 정보는 느린 flash에 배치하는 등의 정보를 가질 수 있다.

메모리 맵 페리페럴 - 페리페럴이 접근하기 쉽게 고정된 정확한 메모리 맵상의 주소 배치를 돕는다.

상수 영역의 함수 - Scatter-loading은 (어플리케이션이 호출하는) 함수는 메모리에 같은 영역에 항상 위치 되게끔 돕는다. 

힙과 스택 심볼의 표현 - 힙과 스택 영역을 위한 심볼이 Scatter-loading에 정의될 수 있다. 

 

7.1.3 Linker-defined symbols that are not defined when scatter-loading

Scatter-loading이 이미지를 메모리에 로드할 때, 몇몇 링커가 정의한 심볼들은 정의되지 않는다. 

아래와 같은 심볼은 scatter 파일이 사용될 때 정의되지 않는다.

• Image$$RO$$Base.
• Image$$RO$$Limit.
• Image$$RW$$Base.
• Image$$RW$$Limit.
• Image$$XO$$Base.
• Image$$XO$$Limit.
• Image$$ZI$$Base.
• Image$$ZI$$Limit.

 

만약 당신이 scatter 파일을 사용하지만, 스택, 힙을 위한 특정 영역을 사용하지 않는 경우, 혹은 __user_setup_stackheap()을 다시 구현하지 않는 경우 에러 메시지가 뜬다.

 

7.1.4 Specifying stack and heap using the scatter file

ARM C 라이브러리는 다중으로 구현된 __user_setup_stackheap() 함수를 제공하며, scatter 파일이 제공하는 정보에 맞는 것을 자동으로 선택할수 있게 한다. 

 

당신의 scatter 파일에 ARM_LIB_HEAP과 ARM_LIB_STACK 영역이 정의 되어 있다고 하자, 이는 라이브러리로 하여금 __user_setup_stackheap()의 non-default 구현(디폴트가 아닌)을 선택하게 한다. 

 

e.g. 디폴트 메모리 주소

• Image$$ARM_LIB_STACK$$Base.
• Image$$ARM_LIB_STACK$$ZI$$Limit.
• Image$$ARM_LIB_HEAP$$Base.
• Image$$ARM_LIB_HEAP$$ZI$$Limit.

혹은 

• Image$$ARM_LIB_STACKHEAP$$Base 
• Image$$ARM_LIB_STACKHEAP$$ZI$$Limit.

 

e.g. 사용자가 scatter 파일에 정의하는 경우. 즉, ARM_LIB_HEAP과 ARM_LIB_STACK 영역을 정의

 - 이때는 사용자가 할당 과정을 따로 포함해야 한다.

LOAD_FLASH …
{
  …
  ARM_LIB_STACK 0x40000 EMPTY -0x20000 ; Stack region growing down
  { }
  ARM_LIB_HEAP 0x28000000 EMPTY 0x80000 ; Heap region growing up
  { }
  …
  
  혹은 
  
  ARM_LIB_STACKHEAP 0x 40000
}

 

7.1.6 Scatter-loading images with a simple memory map

싱글 메모리 맵을 가진 이미지 파일의 경우, 메모리 맵은 Linker Command Option 혹은 Scatter file 로 지정할 수(specify) 있다. 

즉, 아래 둘 중에 선택할 수 있는 것이다.

- Scatter 파일의 사용

- Linker Command-Line Option 으로 메모리 맵 구체화(Specify)

예시를 보자

 

위와 같이 메모리를 지정하기 위해서는 Scatter file을 다음과 같이 지정한다.

LOAD_ROM 0x0000 0x8000     ; Name of load region (LOAD_ROM),
                           ; Start address for load region (0x0000),
                           ; Maximum size of load region (0x8000)
{
    EXEC_ROM 0x0000 0x8000 ; Name of first exec region (EXEC_ROM),
                           ; Start address for exec region (0x0000),
                           ; Maximum size of first exec region (0x8000)
    {
        * (+RO)            ; Place all code and RO data into
                           ; this exec region
    }
    SRAM 0x10000 0x6000    ; Name of second exec region (SRAM),
                           ; Start address of second exec region (0x10000),
                           ; Maximum size of second exec region (0x6000)
    {
      * (+RW, +ZI)         ; Place all RW and ZI data into
                           ; this exec region
    }
}

 


Chapter 8 Scatter File Syntax

8.2 Syntax of a scatter file

8.3 Load region descriptions

8.3.1 Components of a load region description

로드 영역 묘사의 구성요소는 로드 영역을 표기하거나, 어떤 부분의 ELF 파일이 해당 영역에 위치하여 컨트롤 해야 하는 지 나타낸다.

- 이름(name)

- 베이스 주소(base address)

- 로드 영역의 특징(properties of the load region)

- 하나 이상의 실행 영역(execution regions)

 

8.3.2 Syntax of a load region description

load_region_description ::=
  load_region_name (base_address | ("+" offset)) [attribute_list] [max_size]
    "{"
     	execution_region_description+
    "}"

 

8.3.3 Load region attributes

ABSOLUTE - 고정된 주소에 위치되는 내용. 링킹 이후에도 변하지 않음. 

ALIGN alignment - 정렬 제약사항(alignment constraint)를 로드영역 4 ~ alignment  까지 증가 시킨다. alignment 는 항상 2의 자승이다. 만약 load 영역이 base_address가 있는 경우 반드시 정렬되여야 한다(must be alignment aligned).

로드 영역에 ("+" offset) 이있는 경우 링커는 영역의 계산 된 기본 주소를 정렬 경계(alignment boundary)에 정렬합니다.

NOCOMPRESS - RW 데이터 압축은 기본적으로 활성화 되어 있다. 하지만, NOCOMPRESS 키워드를 사용하면 최종 이미지에서 영역의 내용이 압축되지 않도록 지정할 수 있다.

 

8.3.4 Inheritance rules for load region address attributes

 

 


1.1 - Armcc User Guide

9.65 __attribute__((section("name"))) variable attribute

#define SECT90(name) __attribute__ ((section (#name),used))

section은 특정 데이터 섹션에 놓여야 하는 변수를 지칭한다.

 

일반적으로 ARM 컴파일러는 생성되는 .o 파일을 .data, .bss 색션에 위치시킨다.

 

하지만!!, 사용자가 특정 섹션을 만들고 싶은 경우 section 어트리뷰트(attribute)를 사용한다.

 

Example

/* in RO section */
const int descriptor[3] __attribute__((section ("descr"))) = { 1,2,3 };

/* in RW section */
long long rw_initialized[10] __attribute__((section ("INITIALIZED_RW"))) = {5};

/* in RW section */
long long rw[10] __attribute__((section ("RW")));

/* in ZI section */
long long altstack[10] __attribute__((section ("STACK"), zero_init));

 

 

[Ref]

ARM® Compiler v5.06 for μVision

https://www.keil.com/support/man/docs/armlink/armlink_pge1406304378956.htm

https://www.keil.com/support/man/docs/armcc/armcc_chr1359124982450.htm

반응형