그라운드 임베디드 유튜브 구독

노트 / 컴퓨터구조

스택과 힙: 함수 호출이 쌓이는 곳

함수를 부를 때마다 쌓이는 스택, 런타임에 빌려 쓰는 힙. 임베디드에서 스택 넘침과 힙 사용을 조심하는 이유.

GROUND EMBEDDED · 정리 노트컴퓨터구조 07스택과 힙영역크기 결정위험스택링커 스크립트넘침힙링커 스크립트단편화, 할당 실패

스택

함수를 호출하면 돌아갈 주소, 저장해야 할 레지스터, 지역 변수가 스택에 쌓이고 함수가 끝나면 걷힙니다. Cortex-M의 스택은 높은 주소에서 낮은 주소로 자랍니다.

  • 지역 배열 uint8_t buf[512];는 스택 512바이트를 씁니다.
  • 인터럽트가 걸리면 레지스터 8개(32바이트, FPU 사용 시 더 많이)가 자동으로 쌓입니다.
  • 함수 호출이 깊어지거나 인터럽트가 중첩되면 스택이 더 깊어집니다.

스택 넘침

스택이 정해진 영역을 넘으면 그 아래에 있는 전역 변수나 힙을 덮어씁니다. 증상은 "가끔 변수 값이 이상해진다", "특정 기능을 켜면 하드폴트"처럼 원인과 멀리 떨어져 나타납니다. 스택 영역을 0xA5 같은 패턴으로 채워 두고 나중에 얼마나 지워졌는지 보면 최대 사용량을 잴 수 있습니다.

힙

malloc으로 런타임에 빌리는 영역입니다. 임베디드에서는 단편화, 실패 처리, 실행 시간이 예측되지 않는 문제 때문에 초기화 때만 쓰거나 아예 쓰지 않고, 대신 정적 배열이나 메모리 풀을 씁니다.

영역 크기 결정 위험
스택 링커 스크립트 넘침
힙 링커 스크립트 단편화, 할당 실패
정적(.data/.bss) 컴파일 시 없음 (맵 파일로 확인)