STM32 강좌

스택(Stack)에 대한 이해와 스택 크기 계산 방법

plainy 0 16,428 2017.04.05 23:57

프로그램이 실행되면서 많은 함수가 실행되며 각 함수들은 지역 변수들을 가지고 있습니다.

함수가 실행될 때 인수로 값이 전달될 수도 있으며 함수의 실행을 마치고 값을 반환하는 경우도 있습니다.

 

스택은 프로그램이 실행되면서 임시로 저장될 데이터들을 저장하기 위한 메모리로 일반적으로 아래와 같은 값들을 저장합니다.

 

스택에 저장되는 값 

  1. 함수에서 생성되는 지역변수와 인수
  2. 함수의 반환 값
  3. 인터럽트가 발생되었을 때의 CPU Register 값
  4. 함수 실행 후 되돌아갈  주소

  

예를 들어 아래와 같이 함수 내에서 생성되는 지역변수는 스택에 저장되며 함수에서 다른 함수를 호출할 경우 새로운 함수의 지역변수가 스택에 추가됩니다.


220f5d5b3a25fe3f18fc6ae70530e7a2_1491404188_1559.png
 

 

IAR컴파일러에서 Stack 확인

IAR컴파일러에서는 Stack Window를 사용하여 스택의 사용량과 저장된 값을 확인할 수 있습니다.

디버깅 화면에서 View메뉴의 Stack항목을 선택하면 Stack Window가 나타납니다.

Bar Graph형태로 전체 스택 영역을 보여주며 아래에는 스택에 저장된 데이터와 주소등을 표시합니다.


220f5d5b3a25fe3f18fc6ae70530e7a2_1491404195_8142.png


* 위와 같이 스택 최대 스택 사용량을 확인하기 위해서는 메뉴의 Tools->Options->Stack에서 Enable graphical stack display and stack usage tracking 항목을 체크 하여야 합니다.

 

 

스택의 크기를 결정하는 방법

스택의 크기는 사용자가 직접 결정하며 컴파일 시 컴파일러에 의해 메모리가 할당됩니다.

스택 크기가 충분하지 않을 경우 저장된 변수가 덮어 씌워지거나 프로그램이 비정상적으로 종료될 수 있으며 반대로 너무 많은 스택을 설정할 경우 메모리가 낭비되게 됩니다.

따라서 프로그램에서 사용되는 스택의 크기를 정확히 알고 설정 하여야 합니다.

 

IAR Compiler에서는 스택의 크기를 예측할 수 있는 스택 사용량 분석(stack usage analysis) 기능을 제공하고 있습니다.

Project Option의 Linker에서 Advanced 탭으로 들어가면 스택 사용량 분석 기능을 활성화 할 수 있습니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404211_4063.png 

 

 

분석된 스택 사용량은 map파일에 표시되므로 map파일을 생성할 수 있도록 아래와 같이 설정합니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404219_3382.png

 

프로그램을 Compiler합니다. project의 output에 map파일이 추가됩니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404226_5578.png
 

map파일에 아래와 같이 STACK USAGE항목이 추가되어 생성되었습니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404234_1031.png

 


 

 

프로그램에서 사용되는 최대 스택의 크기는 108Byte이며 인터럽트에서 사용되는 스택의 크기는 40Byte와 16Byte입니다.

프로그램에서 사용되는 스택과 모든 인터럽트에서 사용되는 스택을 더한 값보다 큰 스택 사이즈를 설정 하여야 합니다.

프로그램에서 함수 호출 과정 중 인터럽트가 발생될 경우 스택에 저장된 데이터가 보존되며 인터럽트 루틴으로 이동하기 때문에 두개의 값을 더한값을 사용하는 것입니다. 또한 인터럽트 실행 중 더 높은 우선순위의 인터럽트가 발생될 경우에 대비해 모든 인터럽트의 스택 값을 더해줍니다.

CSTACK Size >= maxstack("Program entry") + totalstack("interrupt") + safety margin(100);

위와 같이 계산할 경우 108 + 40 + 16 + 100 =  264Byte 가 설정해야 할 스택의 크기입니다.

 

 

스택 크기 적용

사용될 스택의 크기를 확인했으면 컴파일 시 적용될 수 있도록 설정하여야 합니다.

스택의 크기는 프로젝트 옵션의 Linker항목에서 설정합니다.

Linker의 Config에서 Edit를 눌러 링커 설정을 변경합니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404241_0255.png
 

Stack/Heap Sizes탭에서 CSTACK의 값을 변경합니다. 

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404247_0456.png

 

 

 

또는 icf파일을 텍스트 에디터로 열어 아래 값을 직접 수정합니다.

220f5d5b3a25fe3f18fc6ae70530e7a2_1491404252_7654.png
 


Comments

Category
Facebook Twitter GooglePlus KakaoStory NaverBand