본문 바로가기
DSP, MCU/TMS320F2838x (C28x)

CMD 파일 (linker command files) 작성 팁

by eteo 2022. 9. 7.

공식 홈페이지의 작성 팁 : https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html#barely-beyond-basics

 

TI Linker Command File Primer

 

software-dl.ti.com

 

 

하기 자료 출처 : http://mcublog.co.kr/ (timcu)

 

TI MCU 카페

 

mcublog.co.kr

 

TI DSP 개발에 관련하여 CMD 파일의 작성법에 대해 아는 사람은 알고 모르는 사람은 모르는 몇 가지 간단한 팁을 알려드리겠습니다.

 

CMD 파일은 보통 아래와 같이 MEMORY{}에서 사용하는 DSP의 메모리 영역을 정의하고, SECTION{}에서 섹션들을 MEMORY{}에서 정의된 메모리 영역에 할당 방식으로 작성하게 됩니다.

 

 

 
MEMORY
{
    PAGE 0:   /* Program Memory */
    ~~~
        RAMH0       : origin = 0x3F8002, length = 0x001FFF     /* on-chip RAM block H0 */
        RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */
        RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
    ~~~

    PAGE 1 :   /* Data Memory */
    ~~~
        RAMM0       : origin = 0x000000, length = 0x000400    /* on-chip RAM block L1 */
        RAMM1       : origin = 0x000400, length = 0x000400    /* on-chip RAM block L0 */
    ~~~
}

SECTION
{
    /* Allocate program areas: */
    ~~~
    .text             : > RAML0      PAGE = 0
    ~~~

    /* Allocate uninitalized data sections: */
    ~~~
    .ebss             : > RAML0      PAGE = 1
    ~~~
}

[그림 1] 일반적인 CMD 파일 예

 

 

그런데 만일 위와 같이 작성된 CMD 파일에서 프로젝트를 빌드 했을 때 아래와 같은 에러 메시지가 나타난다면 어떻게 해야 할까요?

 

 

 
---------------  INFLASH_BURNING_FROM_EXFLASH_F2812.pjt - Debug  ---------------
[Linking...] "C:\CCStudio_v3.3\C2000\cgtools\bin\cl2000" -@"Debug.lkf"
<Linking>
>>   error: cant allocate .text, size 000012cf (page 0) in RAML0 (avail: 00001000)
>>   error: errors in input - ./Debug/INFLASH_BURNING_FROM_EXFLASH_F2812.out not built
 
>> Compilation failure
 
Build Complete,
  3 Errors, 0 Warnings, 0 Remarks

 

[그림 2] 에러발생 예

 

 

위와 같은 에러는 .text섹션이 할당된 RAML0 메모리 영역의 크기가 .text 섹션의 크기보다 작아서 발생하는 에러입니다한마디로 섹션크기가 메모리영역을 넘친 것입니다. ".text" 섹션의 크기는 에러메시지 상으로 보면 "0x12CF" 인 것을 알 수 있습니다이러니 "0x1000" 크기로 정의된"RAML0" 영역에 할당하면 문제가 생길 수 밖에 없습니다이런 문제를 해결하는 방법은 여러 가지입니다한가지씩 살펴 보겠습니다.

 

1. 좀더 큰 메모리 영역에 섹션을 배치한다.

간단하게 아래처럼 RAML0 영역보다 크게 정의된 RAMH0을 사용하는 방법이 있습니다.

 

 

.text             : > RAML0      PAGE = 0
                  ↓
.text             : > RAMH0      PAGE = 0

 

 

 

2. 메모리 영역을 좀더 넓게 정의한다.

다음은 아예 메모리 영역을 좀더 넓게 정의해서 사용하는 방법이 있습니다.

 

 

RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */
RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */
               ↓
RAML0L1     : origin = 0x008000, length = 0x002000     /* on-chip RAM block L0L1 */
     ~~~
     ~~~
.text             : > RAML0      PAGE = 0
                  ↓
.text             : > RAML0L1    PAGE = 0

  

3. Automatic Section Splitting 기능을 활용한다.

Automatic Section Splitting 이란 메모리 영역의 크기를 넘친 섹션을 다른 메모리 영역에 자동으로 나누어 할당하는 것을 말합니다다음과 같이 CMD 파일을 작성하면 .text섹션은 RAML0 영역에서 할당되다가 모자란 만큼 RAML1 영역에도 자동으로 할당되게 됩니다.

 

.text             : > RAML0      PAGE = 0
                  ↓
.text              >> RAML0 | RAML1     PAGE = 0

  

4. Automatic Section allocate 기능을 사용한다.

다 음과 같이 CMD 파일을 작성하면 RAML0에 모두 할당될 수 있는지 확인하고모두 할당할 수 없으면 RMAH0으로 넘어갑니다만약 RAMH0 에도 할당할 수 없으면 링커 에러가 발생합니다., Automatic Section Splitting을 활용하지는 않지만전체 섹션에 할당될 수 있는 메모리 영역을 자동으로 찾아서 할당하게 됩니다. ">" 꺽쇄가 한 개인 것에 주의하세요~

 

.text             : > RAML0      PAGE = 0
                  ↓
.text               > RAML0 | RAMH0     PAGE = 0

 

여기까지 CMD 파일을 작성하는 몇 가지 TIP을 예시 함께 알아봤습니다유저 분들은 본인의 상황에 맞게 위의 방법들을 골라서 사용하시면 되겠습니다

 

 

출처 : 싱크웍스 블로그  http://mcublog.co.kr/420