TI TMS320 입문 연재 입니다.
>. CCS, C2000Ware, sprc191 (sprc097) 설치, compile
>. XDS100, XDS200 로 CCS Debug 하기
>. UniFlash 로 (CCS 없이) FW Download 하기(Driver 설치)
>. C2Prog 로 (CCS 없이) FW Download 하기
>. C2000Ware Sample code 를 다른곳으로 가져 가기
>. 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) 기준:
- DSP가 리셋되면 내장 부트로더가 실행됩니다.
- 부트모드 핀 값이 0010 → 부트로더가 주소 0x3F7FF6으로 점프
- 이 위치의 codestart 섹션이 실행됨
- 내부 명령 LB _c_int00 수행 → TI의 표준 초기화 루틴 호출
- 시스템 초기화 후 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
'개발 > TI_TMS320' 카테고리의 다른 글
| TMS320 F28069 SPI EEPROM CAT25320, CAT25512 code (0) | 2025.12.18 |
|---|---|
| 초기화 코드 정리: InitSysCtrl , InitInt 등 : TMS320 (0) | 2025.10.24 |
| TI: FLASH 에서 실행, DELAY_US 문제 (0) | 2025.10.21 |
| C2Prog 로 (CCS 없이) FW Download 하기 - TI TMS320 입문 (0) | 2025.10.20 |
| TMS320F28069 eQEP 코드 예시 2 (0) | 2025.09.09 |