메모리 구조
1. C 컴파일러
C 컴파일러는 메모리 영역을 4개의 Segment로 나누어 사용한다.
1) Code Segment
작성한 코드가 저장되는 영역
2) Data Segment
Static 변수 및 전역변수가 저장되는 영역
※ Reset 후에 각 Segment 영역을 설정한 뒤 Flash Memory에 있는 변수를 SRAM에 복사하는 방식으로 동작한다.
3) Heap Segment
동적 메모리가 할당되는 영역
4) Stack Segment
함수에 선언된 지역변수 또는 매개변수들이 저장되며, 서브 루틴 또는 인터럽트 서비스 루틴들이 Call 되었을 때 돌아가야 할 주소들을 저장하는 영역
※ 프로그램이 Booting 될 때 가장 먼저 Stack 영역부터 형성한다.
<참고>
서브 루틴: 반복되어 사용하는 것을 메모리에 한번 적재하여 여러 번 사용할 수 있도록 하는 방법
인터럽트 서비스 루틴: 인터럽트에 대응하여 특정기능을 처리하는 기계어 코드 루틴
2. MCU
1) Flash Memory
비 휘발성 메모리로 전원이 차단되어도 데이터가 사라지지 않는다.
2) SRAM
휘발성 메모리로 전원이 차단되면 데이터가 사라진다.
SRAM의 구조
1. Static Data(Data Segment)
Heap의 시작부분을 Stack을 향해 위로 밀어 넣고 이 공간을 영원히 차지한다.
2. Heap
동적으로 할당된 데이터로 인해 Heap이 Stack 쪽으로(낮은 주소에서 높은 주소로) 증가한다. Static Data 영역과는 달리 Heap에서는 할당을 취소하여 공간을 확보할 수 있지만 이것이 반드시 Heap을 축소시키는 것은 아니다. Heap에서 그 위에 다른 동적 데이터가 있는 경우 Heap 상단은 이동되지 않으며, 이 경우 마치 치즈처럼 Heap 영역이 구멍으로 가득 차게 된다. 이를 Fragmented Heap이라고 부르며 위 그림과 같다.
3. Stack
모든 함수 호출은 Stack이 Heap 방향으로 커지도록(높은 주소에서 낮은 주소로) Stack 프레임을 생성한다. 각 Stack 프레임에는 함수에 전달된 모든 매개변수나 지역 변수가 포함되며, 이 데이터는 함수 내에서 사용할 수 있지만 함수가 종료되면 공간이 100% 회수된다.
<참고 자료>
https://m.blog.naver.com/tdrag/220588912907
https://learn.adafruit.com/memories-of-an-arduino/optimizing-sram
https://blog.naver.com/PostView.naver?blogId=msyang59&logNo=220044343146