본문 바로가기
Embedded SW/Embedded SW Introduction

Stack 예제를 통한 정리 2편 (자료구조, MCU 모두 정리)

by 방구석 임베디드 2022. 9. 17.
반응형

안녕하세요.

방금 전 글에서

우리는 자료구조 Stack 예제를 Visual Studio로 한번 돌려보았습니다.

아래 글을 다시 링크를 걸어놓았습니다.

참고해 주시기 바랍니다.

Stack 예제를 통한 정리 1편 (자료구조, MCU 모두 정리)

 

이제 이러한 Stack의 데이터 저장형태가

실제 MCU에서 어떻게 동작하는지 살펴 보도록 하겠습니다.

 

인피니언의 MCU에서는 Stack이 총 3가지로 형태로 구분이 되어져 있습니다.

보통 MCU는 Stack을 하나의 영역으로 관리하는데

인피니언은 조금더 신경을 쓴것 같습니다 ㅎ

 

아래는 Linker Script 파일에서 가지고 온

3가지 Stack 영역입니다.

#define LCF_CSA0_SIZE 8k

#define LCF_USTACK0_SIZE 2k

#define LCF_ISTACK0_SIZE 1k

먼저 CSA : Context Save Area 의 약자입니다.

USTACK은 User Stack을 뜻합니다.

ISTACK는 약어를 못찾겠네요.

아마 Interrupt Stack일것 같은데요

 

인터럽트 ISR 발생시 그 함수(Interrupt Sevice Routine 함수)에서 사용하는 지역변수를 할당할때

사용하는 영역입니다.

USTACK은 일반적인 함수에서 지역변수를 사용할때 할당되는 영역입니다.

CSA는 함수에서 function call 또는 인터럽트가 발생할때

PC(Program Counter)가 변경이 되는데

PC는 CPU가 instruction을 수행하는 위치라고 생각하시면 됩니다.

이때, PC가 변경될때 해당 중요 Register 정보를 어딘가 저장을 해야하는데

바로 CSA영역에 저장을 합니다.

그러면 이제 한번 살펴 보도록 하겠습니다.

먼저 USTACK 부분만을 살펴보도록 하겠습니다.

아래는 링커스크립트 파일을 캡처한 것입니다.

_lc_ue_ustack_tc0 과 _lc_ub_ustack_tc0 의 주소값이 보이고

이것이 stack영역의 시작과 끝을 나타내고 있네요!

 

map 파일을 통해서 확인해 보도록 하겠습니다.

UStack의 시작영역이 0x70019600 인것을 확인할수 있습니다.

IStack의 경우는 0x70019b00 인것을 확인할수 있습니다.

 

그러면 0x70019600을 한번 살펴 보도록 하겠습니다.

0x70019600에서 위로 점점 저장이 되는것을 볼수 있습니다.

보이시나요?

그리고 A10이라는 레지스터는 User Stack의 위치를 나타내고 있습니다.

아래는 Reference Manaul에서 캡처한 부분입니다.

A10 레지스터에 Stack Pointer가 저장이 되고 있는것을 알 수 있습니다.

그러면 레지스터로 한번 살펴 보도록 하겠습니다.

지금 Stack Pointer는 0x700195F8을 가르키고 있습니다.

이제 main 함수의 지역변수를 한번 선언해 보도록 하겠습니다.

아래 u32nuMainCnt라는 변수를 선언하였습니다.

그리고 u32nuMainCnt를 1 증가시켜 보겠습니다.

위의 그림에서 오른쪽에 빨강색 박스에 1이  증가된 것이 보이시나요?

그렇다면 이제 Main 함수에서 

다시 함수를 타서 Function Call이 일어나도록 해보겠습니다.

보이시나요?

main 함수에서 AppScheduling 함수로 function call이 일어났고

여기서 u32nuSchCnt 지역변수를 할당하였습니다.

위치는 0x700195f0이 되었습니다.

이것을 지난시간에 그렸던

Stack의 그림으로 표현하면 아래와 같습니다.

그렇다면 AppScheduling 함수가 끝나면

위의 u32nuSchCnt부터 회수를 하겠죠?

(Pop이 일어나는 것입니다.)

이러한 Stack 자료구조의 동작이 MCU에서 동일하게 동작하고 있는것을 확인 할 수 있습니다.

​Push와 Pop이 일어나고 있는것이 보이시나요?

 

Stack을 관리하는 일은 아주 중요한일입니다.

혹시라도 Stack이 넘치면 문제를 발생하니까요.

따라서 Stack을 동적으로 또는 정적으로 분석하여

Stack의 안정성을 증명하는것은 대단히 중요한 일입니다.

 

특히 정적분석을 수행하기 위해서는 컴파일러의 옵션활용이 꼭 필요합니다.

나중에 정적분석 Stack분석을 한번 해보면 좋을 것 같습니다.

금일은 이상으로 포스팅을 마치도록 하겠습니다.

반응형

댓글