2014-10-02 5 views
4

임베디드 ARM MCU에서 스택 포인터를 C로 모니터하려고합니다. 프로젝트가 성장함에 따라 얼마만큼의 공간이 남았는지 알고 필요할 경우 더 많이 매핑하고 싶습니다.ARM 어셈블리 - 스택 스택 포인터

컴파일 할 때 생성 된 맵 파일에서 스택의 시작 및 상단 주소를 이미 알고 있습니다.

기본 수학을 수행하고 백분율을 기준으로 스택을 모니터링 할 수 있도록 sp가 가리키는 주소를 얻고 싶습니다. 그러나 ARM에 익숙하지 않고 왜 내 어셈블리가 작동하지 않는지 이해하지 못합니다. . 내가 stackptr에 저장된 주소를 보면, 그 스택의 시작에 바로와 그 변화하지 (나는이 100ms마다 호출 오전)

int stackptr; 
asm 
{     
    LDR r0, =stackptr // put address of C variable stackptr in r0 
    MOV r1, sp   // move value of sp to r1 
    STR r1, [r0]  // put value of r1 in address contained in r0 (stackptr) 
} 

// math using stackptr... 

:

이것은 내가 뭐하는 거지입니다. 나는 이것이 나의 스택의 중앙에 어딘가에 튀는 것을 기대했다.

또한 stack base와 limit (같은 방법이지만 sb와 sl을 사용)의 주소를 얻으려고하면 0이됩니다. 나는 내 연구에서 항상 사용되지는 않는 것 같아 걱정하지 않는다. 컴파일러가 업데이트 가져 오지 생각하고 레지스터에 오래된 사본을 사용하거나 완전히에 대한 액세스를 최적화 할 수 있기 때문에 도움

+3

이 코드는 인터럽트를 통해 실행됩니까? 그렇다면 자체 스택 (및 스택 포인터)을 가질 수 있습니다. – EOF

+0

특정 플랫폼에 대해 말할 수는 없지만이 작업을 수행하는 방법은 여러 가지가 있습니다. [IAR에 의한 위대한 글] (http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Mastering_stack_and_heap_for_system_reliability.pdf)을 살펴볼 수 있습니다. –

+1

이 코드는 Cortex-M ('only'[2 SP 레지스터] (http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/BABDGADF.html) 포함) 또는 Cortex- A/구 아키텍처 (최대 8 개의 은행 복사본)? 또한 어떤 종류의 OS 또는 다른 컨텍스트 전환이 관련되어 있습니까? – Notlikethat

답변

3

에 대한

덕분에, stackptrvolatile 만들어보십시오.

가능한 다른 스택 접근법을 계산하고 보고서를 작성하도록 컴파일러에 요청하는 것이 좋습니다. 예를 들어 GCC에서는 -fstack-usage and -Wstack-usage 플래그를 사용할 수 있습니다. -fstack-usage은 동일한 이름의 .su 파일을 생성하여 각 기능의 스택 사용을보고합니다. -Wstack-usage=X은 전달 된 것보다 더 많은 스택이 필요한 경우 경고합니다. 물론 이것은 정적 분석이므로 컴파일러가 모든 경우를 처리 할 수는 없지만 그렇다면 경고를 생성합니다. GCC를 사용하지 않는다면 상용 컴파일러가 그러한 기능을 가질 것으로 기대합니다.