임베디드 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이됩니다. 나는 내 연구에서 항상 사용되지는 않는 것 같아 걱정하지 않는다. 컴파일러가 업데이트 가져 오지 생각하고 레지스터에 오래된 사본을 사용하거나 완전히에 대한 액세스를 최적화 할 수 있기 때문에 도움
이 코드는 인터럽트를 통해 실행됩니까? 그렇다면 자체 스택 (및 스택 포인터)을 가질 수 있습니다. – EOF
특정 플랫폼에 대해 말할 수는 없지만이 작업을 수행하는 방법은 여러 가지가 있습니다. [IAR에 의한 위대한 글] (http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Mastering_stack_and_heap_for_system_reliability.pdf)을 살펴볼 수 있습니다. –
이 코드는 Cortex-M ('only'[2 SP 레지스터] (http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/BABDGADF.html) 포함) 또는 Cortex- A/구 아키텍처 (최대 8 개의 은행 복사본)? 또한 어떤 종류의 OS 또는 다른 컨텍스트 전환이 관련되어 있습니까? – Notlikethat