문제

Keil 컴파일러에 "--callgraph"옵션을 지정하면 나를 위해 정확한 "최대 스택 사용량"을 정적으로 계산합니다.

아아, 오늘은 "스택 정보가없는 함수"목록과 함께 "최대 스택 사용량= 284 바이트 + 알 수 없음 (스택 크기가없는 함수 ...)"메시지가 표시됩니다.

Nigel Jones는 재귀는 임베디드 시스템에서 정말 나쁜 생각이라고 말합니다. ( "스택 크기 계산" 2009) , 그래서이 코드에서 상호 재귀 함수를 만들지 않도록주의했습니다.

또한 인터럽트 핸들러가 인터럽트에서 최종 복귀 명령까지 인터럽트를 다시 활성화하지 않도록하므로 재진입 인터럽트 핸들러에 대해 걱정할 필요가 없습니다.

재귀 또는 재진입 인터럽트 핸들러없이 최대 스택 사용량을 정적으로 결정할 수 있어야합니다. (그래서 대부분의 답변은 최대 스택 사용량을 확인하는 방법 적용하지 마십시오). 내 이해는 "--callgraph"옵션을 처리하는 소프트웨어가 우선 순위가 더 높은 인터럽트에 의해 중단되지 않은 경우 각 인터럽트 처리기에 대한 최대 스택 깊이와 중단되지 않은 경우 main () 함수의 최대 스택 깊이를 찾습니다. 그런 다음 전체 (최악의 경우) 최대 스택 깊이를 찾기 위해 모두 추가합니다. 이는 main () 백그라운드 태스크가 최하위 우선 순위 인터럽트에 의해 인터럽트 될 때 최대 깊이에 있고 그 인터럽트가 다음으로 낮은 우선 순위 인터럽트에 의해 인터럽트 될 때 최대 깊이에있을 때 발생합니다.

-callgraph를 처리하는 소프트웨어가 "스택 정보가없는 함수"목록의 작은 어셈블리 언어 함수에 대해 혼란스러워하는 것 같습니다. --callgraph documentation 은 사용하는 스택의 양을 수동으로 계산 (또는 보수적으로 추정) 한 다음 (매우 짧기 때문에 간단해야합니다.) "어셈블리 언어 코드에서 프레임 지시문을 사용하여 코드에서 스택을 사용하는 방법을 설명합니다." 그중 하나는 main ()으로 점프하기 전에 스택을 0으로 재설정하는 초기 시작 코드입니다. 따라서 실제로 이것은 0 스택을 소비합니다. 또 다른 하나는 전원을 껐다가 켤 때까지 무한 루프에서 잠기는 "오류"인터럽트 처리기입니다. 이것이 제로 스택을 소비한다고 가정하는 것이 안전합니다.

Keil uVision V4.20.03.0을 사용하여 LM3S1968 ARM Cortex-M3 용 코드를 컴파일하고 있습니다.

어떻게 "프레임 지시문"을 사용하여 "--callgraph"를 처리하는 소프트웨어에 이러한 함수가 얼마나 많은 스택을 사용하는지 알려줄 수 있습니까? 아니면 최대 스택 사용량을 결정하는 더 좋은 방법이 있습니까?

( 최대 스택을 결정하는 방법 참조 gcc가있는 임베디드 시스템에서의 사용법은? gcc 컴파일러를 대상으로하는 거의 동일한 질문입니다.)

도움이 되었습니까?

해결책

링커 옵션에서 --info= stack을 사용합니다.그러면 맵 파일에 외부 링크가있는 모든 함수에 대한 스택 사용량이 포함됩니다.

단일 작업 환경에서 main ()에 대한 스택 사용량은 전체 요구 사항을 제공합니다.각 작업에 자체 스택이있는 RTX와 같은 RTOS를 사용하는 경우 모든 작업 진입 점에 대한 스택 사용량을 확인한 다음 작업 컨텍스트에 대해 일부 (RTX의 경우 64 바이트)를 추가해야합니다.저장.

Keil에 적용 할 수있는이 기술과 기타 기술은 여기

다른 팁

유타 대학교의 John Regehr는 http://www.embedded.com/design/prototyping-and-development/4025013/Say-no-to-stack-overflow ,ftp.embedded.com에 대한 링크가 부실하고 "without interrupts disabled"가 발생하면 첫 번째 또는 마지막 단어가 무효화되어야합니다.상업적 세계에서 Coverity에는 구성 가능한 스택 오버플로 검사기가 있으며 CodeWarrior의 일부 버전에는 반 문서화 된 warn_stack_usage pragma가 있습니다.(내 버전의 컴파일러 문서에는 언급되지 않았지만 MetroWerks의 "Targeting Palm OS"문서에 있습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top