我正在尝试在嵌入式ARM MCU上监视C中的堆栈指针。随着项目的发展,我想知道剩下多少空间,并在必要时绘制更多空间。
我已经从编译时生成的映射文件中知道堆栈的起始和顶部地址。
我想得到sp所指向的地址,所以我可以做一些基本的数学运算并在百分比使用的基础上监控堆栈,但我是ARM的新手并且不明白为什么我的程序集不起作用。
这就是我在做的事情:
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...
如果我查看存储在stackptr中的地址,它就在堆栈的开头并且没有改变(我每隔100ms调用一次)。我预计这会在我的筹码中间的某个地方弹跳。
另外,如果我尝试获取堆栈基地的地址并限制(使用相同的方法但使用sb和sl),我只得到0。我并不关心这一点,因为从我的研究来看,它似乎并不总是被使用。
感谢您的帮助
答案 0 :(得分:3)
尝试制作stackptr
volatile
,因为编译器可以认为它没有得到更新并在寄存器中使用陈旧副本或完全优化对它的访问。
解决问题的另一种方法可能是要求编译器计算可能的堆栈使用情况并创建报告。例如,使用GCC,您可以使用-fstack-usage and -Wstack-usage标志。 -fstack-usage
创建一个具有相同名称的.su
文件,报告每个函数的堆栈使用情况。 -Wstack-usage=X
警告函数是否需要更多堆栈而不是传入。当然这是静态分析,因此编译器无法处理所有情况(但如果是这样则会生成警告)。如果你不使用GCC,我也希望任何商业编译器都有这样的功能。