본문 바로가기
개발/TI_TMS320

CMD 파일, Code Composer Studio(CCS) 빌드과정 - ti

by 즐기며 2025. 10. 22.

 

TI TMS320 입문 연재 입니다.

 

>.  CCS, C2000Ware, sprc191 (sprc097) 설치, compile

>.  XDS100, XDS200 로 CCS Debug 하기    

>.  FLASH 에서 실행, DELAY_US 문제        

>.  UniFlash 로 (CCS 없이) FW Download 하기(Driver 설치)  

>.  C2Prog 로 (CCS 없이) FW Download 하기 

>.  C2000Ware Sample code 를 다른곳으로 가져 가기  

>.  CCS v20 Project 만들기  

>.  CCS,  다른 ( 옛날 ) Compiler (CGT) 버전 설치  

>.  TMS320 F28069 CCS SCI(UART) source  

>.  TMS320 F28069 CCS PWM source     

>.  TMS320 F28069 CCS ADC source   

 

>>.  TMS320 error: program will not fit into available memory  

>>.  CMD 파일, Code Composer Studio(CCS) 빌드과정                == 본글

==========================================

🌟 Code Composer Studio(CCS) 빌드과정, CMD 파일


🧩 1. Build 과정 (CCS 기준)

⚙️ 전체 흐름

Code Composer Studio(CCS)에서 .out 실행 파일이 만들어지는 과정은 다음과 같습니다:

C 소스 파일
   ↓ (컴파일러)
어셈블리 파일 (.asm)
   ↓ (어셈블러)
오브젝트 파일 (.obj)
   ↓ (링커)
실행 가능한 결과 파일 (.out)

🧠 각 단계별 설명

단계 설명

컴파일러 (Compiler) .c 파일을 어셈블리 코드(.asm) 로 변환합니다. 이 과정에서 문법 검사, 최적화 등이 이루어집니다.
어셈블러 (Assembler) 어셈블리 파일을 기계어 코드(.obj) 로 변환합니다. 그러나 아직 주소 정보가 없어 직접 실행은 불가능합니다.
링커 (Linker) 여러 개의 .obj 파일을 결합하고, 각 코드와 데이터에 메모리 주소를 할당하여 .out 실행 파일을 생성합니다.

⚠️ 오브젝트 파일(.obj) 은 기계어를 포함하지만,
메모리 주소가 없으므로 링커가 주소를 지정해야만 실행이 가능합니다.


📄 2. CMD 파일(Command File)

CMD 파일은 링커에게 메모리 구조와 섹션 배치 방법을 알려주는 스크립트 파일입니다.
즉, 프로그램이 “코드와 데이터를 어느 메모리에 어떻게 배치할지”를 결정하는 핵심 문서입니다.


🔹 CMD 파일의 기본 구조

2개 부분 입니다.  MEMORY 부분과 SECTIONS 부분 입니다.

MEMORY {
   ...
}
SECTIONS {
   ...
}

 

 

블록 이름 역할

MEMORY 시스템의 메모리 자원(영역) 을 정의합니다. 각 영역은 이름, 시작 주소(origin), 크기(length)를 가집니다.
메모리 영역(이름, 시작주소, 크기) 정의
SECTIONS 프로그램의 코드(.text), 데이터(.data) 등의 섹션을 메모리 블록에 배치하도록 링커에게 지시합니다.
코드·데이터 섹션을 특정 메모리에 배치 지시

 


📘 3.  C28x_Basic.cmd 파일 분석

🧩 3-1. MEMORY 블록

📌 MEMORY 블록 정리

 

Page0 과 Page1 로 되어 있으며 그안에는

"명칭:  시작= , 길이 = " 형태로 되어 있읍니다. 

PAGE 0 코드(프로그램)용 메모리 섹션 배치
PAGE 1 데이터용 섹션 배치
origin 메모리의 시작 주소
length 해당 블록의 크기(바이트 단위)
   

 

 

🧩 MEMORY 블록 예시

MEMORY
{
PAGE 0 :      /* Program Memory */
   RAMM0       : origin = 0x008000, length = 0x000400
   BEGIN       : origin = 0x3F7FF6, length = 0x000002            
   PRAMH0      : origin = 0x3F8002, length = 0x001FFE
   RESET       : origin = 0x3FFFC0, length = 0x000002
   EXPRAM      : origin = 0x106000, length = 0x002000          

PAGE 1 :      /* Data Memory */
   RAMM0       : origin = 0x000050, length = 0x0003B0
   EXDRAM      : origin = 0x100000, length = 0x006000
   RAML0L1     : origin = 0x008000, length = 0x002000      
}

📌 MEMORY 블록 규칙 정리

구분 설명

PAGE 0 코드(프로그램)용 메모리 섹션 배치
PAGE 1 데이터용 섹션 배치
origin 메모리의 시작 주소
length 해당 블록의 크기(바이트 단위)
F28069 구조 단일 메모리 구조로 PAGE 구분이 강제되지는 않음 (논리적 구분에 가깝다)

 

 

풀이:   위 내용중에 EXPRAM 이라는 부분과 EXDRAM 이라는 부분을 살펴니다.

EXPRAM : origin = 0x106000, length = 0x002000    
EXDRAM : origin = 0x100000, length = 0x006000

→EXPRAM은 0x106000 번지부터 0x2000 크기의 메모리 영역에 붙여진 이름입니다. PAGE 0에 정의되어 있읍니다. 향후, 코드 성분을 탑재할 예정이다. 이름은 아무렇게나 정해도 된다. 즉 EXPRAM 대신에 아무 이름이나 써도 된다. 같은 방식으로, EXDRAM은 PAGE 1에 정의되어 있으며, 시작번지는 0x100000이고 크기는 0x6000으로 정의 되어있다.

 


🧩 3-2. SECTIONS 블록 예시

SECTIONS {
  codestart : > BEGIN, PAGE = 0

  ramfuncs  : LOAD = FLASHD,
              RUN = RAML0,
              LOAD_START(_RamfuncsLoadStart),
              LOAD_END(_RamfuncsLoadEnd),
              RUN_START(_RamfuncsRunStart),
              LOAD_SIZE(_RamfuncsLoadSize),
              PAGE = 0

  .reset    : > RESET,   PAGE = 0, TYPE = DSECT
  vectors   : > VECTORS, PAGE = 0, TYPE = DSECT
}

📍 주요 섹션 설명

섹션 설명

codestart 프로그램 시작 위치(0x3F7FF6)에 위치하며, _c_int00 실행 명령 포함 (→ main() 호출로 이어짐)
ramfuncs FLASH에 저장된 함수를 RAM으로 복사하여 실행하기 위한 섹션 (실행 속도 향상 목적)
TYPE = DSECT “주소만 예약”하는 섹션. 실제 데이터는 존재하지 않음. (예: 리셋 벡터, 인터럽트 벡터)

🚀 4. 부트(boot) 시 동작 순서

MC 모드(부트모드 0010) 기준:

  1. DSP가 리셋되면 내장 부트로더가 실행됩니다.
  2. 부트모드 핀 값이 0010 → 부트로더가 주소 0x3F7FF6으로 점프
  3. 이 위치의 codestart 섹션이 실행됨
  4. 내부 명령 LB _c_int00 수행 → TI의 표준 초기화 루틴 호출
  5. 시스템 초기화 후 main() 함수로 진입

 ‘Boot Loader 실행’이라는 부분이 나온다. Boot Loader가 실행되면서, DSP 칩이 가지고 있는 4개의 Boot Mode 핀 상태를 점검한다. Boot Mode 핀 상태에 따른 부트 경로는 다음과 같다

_c_int00 은 C 런타임 초기화를 수행하고, 전역 변수 초기화 후 main()을 호출합니다.



🔧 5. 링커(Linker) 과정 요약

기능 설명

결합 여러 오브젝트(.obj) 파일을 하나의 프로그램으로 통합
주소 할당 CMD 파일의 MEMORY/SECTIONS 정보를 기반으로 각 코드·데이터의 실제 메모리 주소를 배정
출력 생성 실행 가능한 .out 파일과, 주소·심볼 정보를 담은 .map 파일 생성

 

 

 

 

📁 .map 파일은 디버깅 및 메모리 최적화 시 매우 중요한 참고 자료입니다.


📘 6. DSP281x_Headers_nonBIOS.cmd

🔹 역할

  • BIOS 없이 MMR(Memory-Mapped Registers)을 설정하는 CMD 파일
  • 관련 메모리 블록 및 섹션 배치를 정의



🔹 특징

  • 프로그램 영역은 비워두고, 데이터 메모리(Page 1) 만 정의
  • MMR은 C언어에서 데이터 변수처럼 다루어지기 때문

💡 예시: ADC 관련 메모리 매핑

구성 요소 설명

MEMORY 블록 Page1에 ADC는 0x007100 번지부터 0x000020 길이로 배치
SECTIONS 블록 AdcRegsFile 섹션이 ADC 메모리 영역에 주입됨
C 코드 #pragma DATA_SECTION(AdcRegs, "AdcRegsFile") 로 지정
변수 선언 volatile struct ADC_REGS AdcRegs;
헤더 파일 DSP281x_Adc.h에 ADC_REGS 구조체 정의
결과 AdcRegs 구조체를 통해 ADC 하드웨어 레지스터 직접 접근 가능

🧾 정리

항목 설명

DSP281x_Headers_nonBIOS.cmd Non-BIOS 환경에서 MMR 관련 섹션 배치 담당
MMR(Page1) 데이터로 취급되어 Page 1에 배치됨
C 코드 연결 #pragma DATA_SECTION과 구조체 선언을 통해 하드웨어 접근 가능

⚠️ 7. CMD 파일 에러 발생 시 대처법

❗ 예시 에러 메시지

error: can't allocate .text, size 000012cf (page 0) in RAML0 (avail: 00001000)

🔍 원인

  • .text 섹션의 크기(0x12CF)가 RAML0 메모리 크기(0x1000)보다 큼
  • 즉, 섹션 크기가 메모리 영역을 초과한 경우

✅ 해결 방법

1️⃣ 더 큰 메모리 영역에 배치

.text : > RAMH0 PAGE = 0

→ 단순히 더 큰 RAM 블록으로 변경.


2️⃣ 메모리 영역을 넓게 정의

RAML0L1 : origin = 0x008000, length = 0x002000
.text : > RAML0L1 PAGE = 0

→ RAML0과 RAML1을 묶어 하나의 큰 영역으로 정의.


3️⃣ Automatic Section Allocate 기능

.text : > RAML0 | RAMH0 PAGE = 0

→ 첫번째 (RAML0) 에 할당 시도 후 불가하면 다음것(RAMH0)으로 자동 이동.

    마지막 꺼도 마땅 하지 않으면, 에러 발생 합니다.


4️⃣ Automatic Section Splitting 기능

.text : >> RAML0 | RAML1 PAGE = 0

→ 섹션을 RAML0과 RAML1로 자동 분할하여 배치. 앞에 것이 다 차면, 뒤에것에 할당 합니다.

🔸 “ > ” : 순차적 할당
🔸 “>>” : 분할(스플릿) 할당


🧠 8. CMD 파일에서 #define 문 사용하기

CMD 파일도 C 전처리문(#define, #if, #else)을 사용할 수 있습니다.


📘 예시 코드

#if defined(_FLASH)
    #define DATA RAMLS | RAMD | RAMG1
    #define CODE FLASH
    #define BEGIN FLASH_BEGIN
#else
    #define DATA RAMLS | RAMD | RAMG1
    #define CODE RAMLS | RAMD | RAMG1
    #define BEGIN RAM_BEGIN
#endif

⚙️ 설정 방법

CCS 설정 경로:
Project Properties → Linker → Advanced Options → Command File Preprocessing → Predefined Symbols

→ Predefined Symbols 항목에 _FLASH 등 필요한 심볼을 추가해야 적용됩니다.


📚 전체 종합 요약

구분 핵심 내용

빌드 과정 C → ASM → OBJ → OUT
CMD 파일 링커용 메모리·섹션 배치 스크립트
MEMORY 물리적 메모리 구조 정의
SECTIONS 코드·데이터 섹션 배치 지시
F28069.cmd PAGE0: 코드, PAGE1: 데이터
부트 시퀀스 codestart(0x3F7FF6) → _c_int00 → main()
nonBIOS CMD MMR(ADC 등) 메모리 매핑 담당
에러 해결 메모리 확장, 자동 할당, 분할 할당 등
#define 사용 전처리 심볼을 CCS 설정에서 등록 필요

 Application Note - C2000 SysConfig Linker Command Tool    https://www.ti.com/lit/an/sprad49/sprad49.pdf

sprad49.pdf
0.99MB