공식 홈페이지의 작성 팁 : https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html#barely-beyond-basics
하기 자료 출처 : http://mcublog.co.kr/ (timcu)
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
'임베디드 개발 > TMS320F2838x (C28x)' 카테고리의 다른 글
TMS320F28388D ] 프로젝트 복사하기 (0) | 2022.09.07 |
---|---|
TMS320F2838x ] PIE Vector Table (0) | 2022.09.07 |
DSP ] C28x 계열 Data Types (0) | 2022.09.06 |
JTAG 에뮬레이터를 연결해서 사용하기 (0) | 2022.09.05 |
TMS320F28388D ] 예제파일 불러오는방법 (LED Blink) (2) | 2022.09.03 |