인프런 커뮤니티 질문&답변
stack overflow
작성
·
407
1
안녕하세요
강사님,
스택오버플로우 챕터에서 태스크 안에 배열을 540바이트를 할당하고 돌렸음에도 task가 돌아가는 것을 영상으로 확인했습니다.
1.
동작되는 것이 문제라고 하셨는데 그것이 왜 동작되는지에 대한 이유가 궁금합니다.
만약, 태스크 스택 사이즈가 512바이트였다면, 그 태스크 안에서 사용 가능한 스택은 정해진 만큼만 사용 가능한 것으로 알고 있습니다.
명확하게 큰 사이즈의 변수를 쓸 경우에는 문제가 발생한다는 것은 이미 경험한 바 있습니다만, 영상과 같은 경우에는 모르고 지나칠 수도 있을거 같습니다.
2.
예제를 보면 아래에서 memset으로 배열의 변수를 어떤 값으로 초기화를 해줍니다. 이유가 컴파일러 최적화로 인한 메모리 할당이 안 되는 것을 방지하기 위한 것인가요?
또, UNUSED 매크로 함수를 사용한 이유가 무엇인가요?
답변 1
1
deckster님! 안녕하세요~~
FreeRTOS 프로그래밍 강좌에 관심 가져주셔서 감사드리고, 질문하신 내용에 답변드립니다.
(질문1) 스택 오버플로우에 관련된 질문
전체 스택사이즈는 4K 바이트이고, 어떠한 함수를 실행하고 있는 특정 시점에 사용가능한 스택사이즈가 850바이트라고 가정해볼게요. 지역변수 char s[1024]; 를 포함한 임의의 함수를 실행하였을 경우, 이것이 문제가 있다는 사실은 누구나 공감할 수 있습니다. 하지만, 예상외로 이 함수의 실행 후 아무일도 일어나지 않을 가능성(문제가 발생하지 않을 가능성)도 있습니다.
사용자가 memset(s, '0', 24); 용도로만 해당 배열을 사용하였기 때문이죠. 1024 바이트 배열이지만 실제로 사용한 것은 24 바이트 뿐이기 때문입니다.
그럼 이런 경우는 어떨까요? memset(s, '0', 1024); 는 스택 오버 플로우를 발생시켰을텐데 괜찮을까요?
이때도 마찬가지로 아무 문제가 발생하지 않을 수 있습니다. 아니죠!!!. 문제가 발생하였지만 우리가 알아차리지 못한 것 뿐입니다.
컴파일러는 사용자가 함수내에서 선언한 지역변수의 합이 스택오버플로우 구간을 침범하는지 여부를 확인해주지 않습니다. 또한 MCU 도 프로그램 실행시 발생할 수 있는 런타임 스택오버플로우를 우리를 위해 확인해주지 않습니다.
그렇기 때문에 메모리 크기가 작은 시스템일수록 스택오버플로우 예방에 더욱 더 주의를 기울여야 하겠습니다.
(질문2) UNUSED을 사용하는 경우
memset 은 위에서 답변드린 것으로 대신합니다. UNUSED 는 어떤 변수를 선언한 이후 사용하지 않으면 빌드후에 WARNING 이 발생하죠?. 단지, 이것을 막는 키워드입니다.





