링커 스크립트와 섹션
.text, .rodata, .data, .bss가 Flash와 RAM의 어디에 놓이는지 정하는 파일. 맵 파일과 함께 읽는 법.
섹션
| 섹션 | 내용 | 위치 |
|---|---|---|
| .isr_vector | 벡터 테이블 | Flash 맨 앞 |
| .text | 코드 | Flash |
| .rodata | const 데이터, 문자열 | Flash |
| .data | 초기값 있는 전역 변수 | RAM (초기값은 Flash) |
| .bss | 초기값 없는 전역 변수 | RAM |
| 스택, 힙 | RAM |
링커 스크립트 (.ld)
MEMORY {
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
SECTIONS {
.text : { *(.isr_vector) *(.text*) *(.rodata*) } > FLASH
.data : { *(.data*) } > RAM AT > FLASH
.bss : { *(.bss*) } > RAM
}
> RAM AT > FLASH가 ".data는 RAM에서 실행되지만 초기값은 Flash에 저장"이라는 뜻입니다.
쓰는 경우
- 부트로더와 앱을 나눌 때 앱의 FLASH ORIGIN을 옮김
- 빠른 함수를 RAM이나 CCM에 배치:
__attribute__((section(".ramfunc"))) - 설정값 저장용 Flash 섹터를 코드 영역에서 빼 둠
맵 파일
빌드 결과의 .map 파일에서 각 함수와 변수의 주소와 크기를 볼 수 있습니다. Flash가 부족하면 맵 파일에서 큰 것부터 찾습니다. printf의 부동소수점 지원이 수십 KB를 차지하는 경우가 흔합니다.