null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
Embedded C 학습 로드맵
Structure
what-is-embedded-system
•
임베디드 SW vs 일반 SW
•
CPU 아키텍처 기초
•
메모리 레이아웃
development-environment
•
툴체인 개요
•
프로젝트 & 라이브러리 구조
•
플래싱 & 디버깅
c-language-for-embedded
•
데이터 타입과 이식성
•
비트 연산
•
volatile과 최적화
gpio
•
GPIO 개념
•
출력 제어
•
입력 읽기 & 디바운스
basic-uart
•
UART 프레이밍 & 보레이트
•
송수신 구현
•
UART 디버그 출력
Flow Structure
CPU 아키텍처 기초
3 / 15
툴체인 개요
☆ Star
↗ Full
메모리 레이아웃
#memory
#flash
#ram
#peripheral
#mmio
@devpc
|
2026-04-02 05:47:08
|
GET /api/v1/flows/10/nodes/196?fv=2&nv=1
Context:
Flow v2
→
Node v1
0
Views
3
Calls
# 메모리 레이아웃 ## 메모리 종류와 역할 임베디드 시스템의 메모리는 크게 세 가지로 나뉩니다. ``` [ 임베디드 메모리 종류 ] +--------------------+ 역할 속성 | Flash | 프로그램 코드, 상수 Read-Only (실행 중) +--------------------+ → 전원 꺼져도 유지 비휘발성 (Non-Volatile) | RAM | 변수, 스택, 힙 Read/Write +--------------------+ → 전원 꺼지면 사라짐 휘발성 (Volatile) | 주변장치 레지스터 | GPIO, UART 등 제어 Read/Write (HW 제어) +--------------------+ → 물리적 회로와 연결 Memory-Mapped I/O ``` --- ## 프로그램이 메모리에 올라가는 방식 컴파일된 프로그램은 여러 **섹션(Section)** 으로 나뉘어 메모리에 배치됩니다. ``` [ Flash & RAM 섹션 배치 ] Flash (비휘발성) RAM (휘발성) +-------------------+ +-------------------+ | .text | | .data (복사됨) | <- 초기값 있는 전역변수 | (코드, 함수 본문) | ---복사---> +-------------------+ +-------------------+ | .bss | <- 초기값 없는 전역변수 (0으로 초기화) | .rodata | +-------------------+ | (문자열 상수 등) | | Heap | <- malloc 동적 할당 +-------------------+ +-------------------+ | .data (원본) | | Stack (↓ 아래로) | <- 지역변수, 함수 호출 프레임 | (RAM으로 복사됨) | +-------------------+ +-------------------+ ``` **중요**: 초기값이 있는 전역변수(`.data`)는 Flash에 원본을 저장해두고, 부팅 시 RAM으로 복사합니다. 이 복사 작업은 `main()` 실행 전 **startup code(crt0 등)** 가 수행합니다. --- ## TC37x: 메모리 맵 TC37x는 여러 종류의 메모리를 각자 다른 주소 영역에 배치합니다. ``` [ TC37x 주소 공간 (간략) ] 주소 범위 이름 용도 0x0000_0000 PFLASH 0 프로그램 코드 (미러 영역) 0x8000_0000 ~ 0x805F_FFFF PFLASH 0 프로그램 Flash (최대 6 MB) 0xAF00_0000 ~ 0xAF0F_FFFF DFLASH 0 데이터 Flash (EEPROM 에뮬레이션) 0x7000_0000 LMU RAM 코어 간 공유 RAM (Local Memory Unit) 0xC000_0000 DSPR 0 코어 0 전용 Data Scratch-Pad RAM 0xD000_0000 PSPR 0 코어 0 전용 Program Scratch-Pad RAM 0xF000_0000 ~ 주변장치(SFR) GPIO, UART, SPI 등 레지스터 ``` ### PFLASH (Program Flash) ``` 0x8000_0000 +----------------------------+ | PFLASH Bank 0 (최대 3 MB) | ← .text, .rodata, .data 원본 +----------------------------+ | PFLASH Bank 1 (최대 3 MB) | +----------------------------+ 0x805F_FFFF ``` - 코드와 상수를 저장하는 비휘발성 메모리 - 읽기 속도는 빠르지만 쓰기(플래싱)는 블록 단위로만 가능 ### DFLASH (Data Flash) - EEPROM처럼 데이터를 저장하는 용도 (예: 설정값, 캘리브레이션 데이터) - PFLASH와 다르게 바이트/워드 단위 읽기 가능, 쓰기 사이클 수명 있음 ### DSPR / PSPR (Scratch-Pad RAM) ``` 코어 0 전용 RAM +-----------------------+ | DSPR 0 (240 KB) | ← .data, .bss, Stack, Heap → 빠른 접근 +-----------------------+ | PSPR 0 (64 KB) | ← 코드 일부를 올려서 Flash보다 빠르게 실행 +-----------------------+ ``` Scratch-Pad RAM은 캐시 없이도 1사이클 접근이 가능한 **가장 빠른 RAM**입니다. 퍼포먼스 크리티컬한 함수를 PSPR에 배치하면 Flash 접근보다 실행 속도가 빨라집니다. ### LMU (Local Memory Unit) ``` LMU RAM (코어 간 공유) +----------------------------+ | LMU 0 (최대 96 KB 등) | ← 코어 0, 1, 2 모두 접근 가능 +----------------------------+ ``` 멀티코어 환경에서 코어 간 데이터를 공유할 때 사용합니다. 단, 여러 코어가 동시에 접근하면 **경쟁 조건(Race Condition)** 이 발생할 수 있으므로 동기화가 필요합니다. --- ## 링커 스크립트와 메모리 배치 링커 스크립트(`.ld` 파일)는 각 섹션이 어느 메모리 주소에 배치될지를 지정합니다. ``` [ 링커 스크립트 개념 ] MEMORY { PFLASH : ORIGIN = 0x80000000, LENGTH = 6M DSPR : ORIGIN = 0xC0000000, LENGTH = 240K } SECTIONS { .text : { *(.text) } > PFLASH ← 코드는 PFLASH에 .data : { *(.data) } > DSPR ← 초기화된 데이터는 DSPR에 .bss : { *(.bss) } > DSPR ← 미초기화 데이터도 DSPR에 } ``` iLLD 기반 프로젝트에서는 ADS가 기본 링커 스크립트를 제공하며, 특별한 경우가 아니라면 수정 없이 사용합니다. --- ## 다른 MCU와의 차이점 > ⚠️ 다른 MCU에서 넘어온다면 이런 점이 다를 수 있습니다. - **STM32**: Flash + SRAM 구조는 동일. 단 SRAM이 DSPR/LMU처럼 분산되지 않고 단일 블록인 경우가 많음. - **RP2040**: Flash는 외부 SPI Flash. 내부 SRAM은 256 KB, XIP(Execute In Place)로 Flash 직접 실행. - **공통 개념**: Flash에 코드, RAM에 데이터, 주변장치는 MMIO — 이 구조는 모든 MCU에서 동일. - **TC37x 특징**: DSPR/PSPR이 코어별로 분리되어 있어 멀티코어 설계에 최적화됨.
CPU 아키텍처 기초
툴체인 개요
// COMMENTS
Newest First
ON THIS PAGE
No content selected.