3.3.6. RW 데이터 압축

RW 데이터 영역은 일반적으로 영역을 압축에 적합하도록 만드는 많은 수의 반복 값 (예를 들어, 0)을 포함합니다. ROM 크기를 최소화하기 위해 RW 데이터 압축이 기본적으로 활성화됩니다.

ARM 라이브러리는 압축 해제 알고리즘을 포함하고 링커는 이미지에 추가할 최적의 알고리즘을 선택하여 이미지가 실행될 때 데이터 영역을 압축 해제합니다. 그러나 링커가 선택한 알고리즘을 무시할 수 있습니다.

이 단원에서는 데이터 압축에 대해 자세히 설명합니다.

압축기 선택

armlink에서는 데이터 섹션의 내용 정보를 수집하여 최적의 압축 알고리즘을 선택하며, 이를 통해 가장 작은 크기의 코드를 생성합니다. 압축이 적절하면 링커는 이미지의 모든 압축 가능 데이터 섹션에 대해 하나의 데이터 압축기만 사용할 수 있으며 최상의 전체 크기를 생성하기 위해 이러한 섹션에서 다른 압축이 시도될 수 있습니다. 압축은 다음과 같은 경우 자동으로 적용됩니다.

Compressed data size + Size of decompressor < Uncompressed data size

압축기가 선택되면 armlink가 이미지의 코드 영역에 해독기를 추가합니다. 최종 이미지에 압축된 데이터가 없으면 해독기는 추가되지 않습니다.

다음 중 한 가지 방법으로 링커가 사용하는 압축을 무시할 수 있습니다.

  • --datacompressor off 옵션을 사용하여 압축 해제

  • 사용자가 선택한 압축기 지정

명령 행 옵션 --datacompressor list를 사용하여 링커에서 사용 가능한 압축기 목록을 얻습니다. 예를 들면 다음과 같습니다.

Num	Compression algorithm
========================================================
0	Run-length encoding
1	Run-length encoding, with LZ77 on small-repeats
2	Complex LZ77 compression

압축이 적용되는 방식

Run-length 압축은 반복되지 않는 바이트와 반복되는 0바이트로 데이터를 인코딩합니다. 반복되지 않는 바이트는 변경 없이 출력되며 그 뒤에 0바이트 개수가 옵니다. Limpel-Ziv 1977 (LZ77) 압축은 확인된 데이터의 마지막 n바이트를 추적하여 이미 확인된 구를 만나면 이전에 확인된 데이터 버퍼에서의 구의 위치와 구의 길이에 해당하는 값 쌍을 출력합니다.

압축기를 지정하려면 링커 명령 행에서 필요한 ID를 사용하십시오. 예를 들면 다음과 같습니다.

armlink --datacompressor 2 ... 

압축기를 선택할 때 다음 사항을 유의하십시오.

  • 0 압축기는 0바이트 영역이 넓지만 0이 아닌 바이트가 적은 데이터에서 잘 수행됩니다.

  • 1 압축기는 0이 아닌 바이트가 반복되는 데이터에서 효과적인 압축률을 제공합니다.

  • 2 압축기는 반복되는 값을 포함하는 데이터에서 효과적인 압축률을 제공합니다.

링커는 데이터가 대부분(>75%) 0바이트를 포함하는 경우 0 또는 1 압축기를 선호합니다. 2 압축기는 데이터에 0바이트가 적을 경우(<10%) 효과적인 압축률을 제공합니다. 이미지가 ARM 코드로만 이루어진 경우 ARM 해독기가 자동으로 사용됩니다. 이미지에 Thumb 코드가 포함되는 경우 Thumb 해독기가 사용됩니다. 분명한 선호가 없으면 최상의 전체 크기를 생성하기 위해 모든 압축기가 테스트됩니다(압축기 선택 참조).

Note

사용자의 자체 압축기를 링커에 추가할 수는 없습니다. 사용 가능한 알고리즘과 링커가 알고리즘을 사용하기 위해 선택하는 방법은 향후에 변경될 수 있습니다.

RW 데이터 압축 작업

RW 데이터 압축 작업을 할 경우에는 다음과 같습니다.

  • 링커 옵션 --map을 사용하여 압축이 코드의 영역에 적용된 위치를 확인합니다.

  • Load$$region_name$$Base 심볼이 사용되고 여기서 region_name 앞에 동일한 로드 영역의 압축된 데이터를 포함하는 실행 영역이 오면 링커는 압축을 적용하지 않습니다.

  • 칩 내부 캐시와 함께 ARM 프로세서를 사용하는 경우 압축 해제 후에 캐시를 사용하여 코드 일관성 문제를 피하십시오.

    자세한 내용은 RealView Compilation Tools 버전 3.0 개발자 설명서에서 임베디드 소프트웨어 개발 방법을 설명하는 장을 참조하십시오.

RVCT v2.0 이전에는 __main 섹션과 영역 테이블만 루트 영역에 배치해야 했습니다. RVCT v2.1 이상에서는 RW 데이터 압축을 위해 추가 섹션(예를 들어, __dc*.o 섹션)을 루트 영역에 배치해야 합니다.

스캐터 로딩 설명 파일을 사용하는 경우에는 다음과 같습니다.

  • 코딩될 때 이름이 __dc*.o인 해독기 개체는 루트 영역에 있어야 합니다. 예를 들면 다음과 같습니다.

    ER_ROOT
    {
        __main.o(*)
        * (Region$$Table)
        __scatter*.o(*)
        __dc*.o(*)
    }
    

    또는 가급적 InRoot$$Sections를 사용하여 루트 영역에 있어야 하는 모든 라이브러리 섹션을 배치하십시오. 예를 들면 다음과 같습니다.

    ER_ROOT
    {
          * (InRoot$$Sections)
    }
    

    자세한 내용은 루트 영역에 섹션 할당을 참조하십시오. 또한 RealView Compilation Tools 버전 3.0 개발자 설명서의 임베디드 소프트웨어 개발에 대한 장을 참조하십시오.

  • NOCOMPRESS 특성을 추가하여 로드 또는 실행 영역은 압축하면 안 된다는 것을 지정하십시오(자세한 내용은 스캐터 로딩 설명 파일의 형식적 구문 참조).

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0206GK
Non-Confidential