인프런 커뮤니티 질문&답변

tuckdae님의 프로필 이미지
tuckdae

작성한 질문수

FreeRTOS 프로그래밍

스택 메모리 크기 최적화

stackoverflow 검출 방법 관련해서 질문이 있습니다.

작성

·

526

1

올려주신 강의를 잘 보고 있습니다.

스택오버플로우 검출 관련해서 질문이 있습니다.

말씀해 주신 것 처럼, FreeRTOS 가이드에서 제공된 방법은 stackoverflow를 검출을 "할수는 있다" 정도인듯 한데요. 정리하자면, 현재 환경(st-link, CubeIDE)에서 런타임 중 stackoverflow를 신뢰성 있게 확인 할 수 있는 방법은 없다라고 이해하면 될까요.

추가로, 말씀해주신 stackoverflow 검출을 하는 방법이 FreeRTOS만 그런 것인지 다른 RTOS(상용 OS, 뉴클리어스 등)에서도 적용되는지, 다른방법이 있다면 어떤 것들이 있는지 궁금합니다.

답변 1

0

홍영기님의 프로필 이미지
홍영기
지식공유자

정범종님!!! 안녕하세요. 우선 제 영상을 선택해주셔서 감사합니다.

임베디드 소프트웨어 개발시 스택오버플로우는 개발자가  항시 주의를 기울여야 하는 주제입니다.

특히 CM(cortex-Mx) 의 경우 메모리 크기가 상대적으로 작기 때문에 더욱 조심해야 하죠.

스택오버플로우를 검사하는 방법을 RTOS 커널 내에서 제공해 준다는 점은 환영할 일임은 틀림없겠지만, 아쉽게도 마이크로 C 오에스나 FreeRTOS 모두 완성도 높은 방법을 제시하고 있지는 않습니다.

문맥전환을 할 때 호출되는 함수인 vTaskSwitchContext 내부에서 '스택오버플로우 검사'를 하도록 구현되어 있죠. 문맥전환시에만 스택오버플로우를 검출하기에 실시간 검사라고 부를 수는 없는 노릇이고,  검사 결과 자체도 100% 무결함 검사법은 아닙니다.

하지만, 개발자가 이러한 특징을 알고 사용한다는 전제하에  이 방법이  '스택오버플로우 검사' 의 보조적인 도구로서의 가치는 있다고 생각합니다.

void vTaskSwitchContext( void )

{

. . . 

        /* Check for stack overflow, if configured. */

        taskCHECK_FOR_STACK_OVERFLOW();

. . .

}

하지만, 도구는 도구일 뿐이고, 가장 중요한 것은 스택오버플로우에 대한 개발자의 지속적인 관심일 겁니다.

우리가 금과옥조로 믿고 있는 전역변수의 단점은 더이상 소용량 메모리 풋프린트 시스템에서는 해당되지 않는 말일 수도 있습니다. 이러한 시스템에서는 약간의 단점을 감수하더라도 전역변수를 적극적으로 사용해야 할 수도 있다는 말이죠.

전역 변수의 적극적인 사용이 태스크 스택의 개별 사이즈를 작게 만들 수 있는데 기여를 하고, 스택오버플로우의 발생 위험을 낮추는 일석이조의 효과를 낼 수 있는 것이죠.

기타 방법을 말씀드립니다.

TRACE32 와 같은 ICD 을 이용하면 스택오버플로우 검사를 할 수 있는 것으로 알고 있습니다. 더 자세한 내용은 찾아보셔야 할거에요.

Q. 추가로, 말씀해주신 stackoverflow 검출을 하는 방법이 FreeRTOS만 그런 것인지 다른 RTOS(상용 OS, 뉴클리어스 등)에서도 적용되는지, 다른방법이 있다면 어떤 것들이 있는지 궁금합니다.

=> 제가 오래 전에 개발할 적에는 스택 검사 기능을  사용하지 않았었기 때문에, 다른 OS(뉴클레오스, vxworks 등) 에서 지원해 주는지 여부를 알지 못합니다. 

여기까지입니다. 추가적인 질문이 있으시면 글 남겨주세요.

- 메모리 크기가 작은 시스템에서의 소프트웨어 개발은 고통스럽다 -

글 수정 2021-7-4 오전 7:24

tuckdae님의 프로필 이미지
tuckdae

작성한 질문수

질문하기