구분 | 내용 | 저장위치 | 사용 |
code = text | 함수, 제어문, 상수 등 | ROM | 컴파일 시 크기가 결정되고 이후 변하지 않음 |
data | 초기값이 있는 전역변수, 정적변수 | ROM | |
bss | 초기값이 없는 전역변수, 정적변수 (0으로 초기화) | RAM | |
heap | 동적할당된 지역변수 | RAM | 런타임에 사용되고 heap은 낮은주소에서 높은주소로 데이터가 쌓이고, stack은 높은주소에서 낮은주소로 데이터가 쌓인다. |
stack | 정적할당된 지역변수 | RAM |
정적할당된 지역변수는 메모리의 Stack Segment에 저장되며 선언된 함수가 종료되면 메모리에서 사라진다.
그리고 초기화된 전역변수와 정적변수는 Data Segment에 저장되는데 Data Segment는 ROM(Read Only Memory)에 있어서 한번 선언되면 값을 수정할 수 없는 문제가 생긴다. 따라서 Data Segment는 RAM(Random Access Memory)에 복사한 후 런타임에서 수정되는 값은 RAM에 저장한다. 즉, Data Segment는 ROM, RAM 두 영역 모두를 필요로 한다.
초기화되지 않은 전역변수와 정적변수는 BSS Segment에 저장된다. BSS Segment에 있는 변수들은 스타트업(Startup.s)시에 reset 핸들러가 BSS Segnment의 변수들을 0으로 채우는 과정을 거친다.
위 화면은 빌드 후 나오는 콘솔 화면인데 저중에서 text와 data가 플래시 메모리 영역에 저장된다.
참고로 dec는 text, data, bss의 크기를 합친 값을 10진수로 표현한 것. hex는 16진수로 표현한 것
프로젝트에서 오른쪽 클릭하고 다음과 같이 세팅해서 bin파일이 생성되도록 설정해주면 실제 플래시 메모리에 올라가는 bin 파일을 확인할 수 있다.
또한 프로젝트 폴더에서
startup_stm32f429zitx.s 파일이 최초로 실행되는 어셈블리어 파일이고
STM32F429ZITX_FLASH.ld 가 코드와 데이터 같은 바이너리가 저장될 위치를 지정하는 Linker stript 파일이고, (Linker 란 컴파일 된 object 파일들을 한데 묶어 실행파일로 만드는 것) STM32F429ZITX_RAM.ld 파일은 플래시메모리에 올라간 것을 램에 복사할때 address를 지정해주는 파일이다.
아무튼 위에서 생성된 bin 파일을 HxD라는 Hex Editor 툴을 사용해서 열어보면 가장 먼저나오는 4byte인 0x20030000 (리틀엔디안이라 이렇게 읽는다) 이 바로 스타트업 파일에 등장하는 _estack 값이다.
_estack 의 정의는 STM32F429ZITX_FLASH.ld 에 있는데 램의 끝 주소를 의미하며 동시에 스택포인터의 시작위치이다.
참고 :