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: can't 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 : > RAMH0 PAGE = 0
2. 메모리 영역을 좀더 넓게 정의한다.
다음은 아예 메모리 영역을 좀더 넓게 정의해서 사용하는 방법이 있습니다.
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 | 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
--------------------
참고
[DSP] 컴파일에서 28335_RAM_lnk.cmd 링크 에러 발생시 팁
http://j102.net/?mid=lecture&listStyle=gallery&document_srl=9171&search_target=regdate&search_keyword=20121220
http://processors.wiki.ti.com/index.php/C28x_Compiler_-_Understanding_Linking
http://blog.naver.com/PostView.nhn?blogId=mini_wor1d&logNo=150097758809&redirect=Dlog&widgetTypeCall=true
[출처] CMD파일 작성 팁|작성자 아이리스
'삽질기초 > HW' 카테고리의 다른 글
에너지 저장장치의 용량 (0) | 2014.06.01 |
---|---|
DSP Error 1135 (0) | 2013.04.23 |
레귤레이터 및 소형 모터드라이버의 발열 (0) | 2013.02.15 |
다채널 SMPM 출력 전압 이상 (0) | 2013.02.15 |
via hole (0) | 2012.10.12 |