Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ARM组件-监视器堆栈指针_C_Assembly_Stack_Arm - Fatal编程技术网

C ARM组件-监视器堆栈指针

C ARM组件-监视器堆栈指针,c,assembly,stack,arm,C,Assembly,Stack,Arm,我试图在嵌入式ARM MCU上用C监控堆栈指针。随着项目的发展,我想知道还有多少空间,如果需要的话,可以绘制更多的地图 我已经从编译时生成的映射文件中知道了堆栈的起始地址和顶部地址 我想获得sp指向的地址,这样我就可以做一些基本的计算,并根据使用百分比监控堆栈,但我对ARM是新手,不明白为什么我的程序集不能工作 这就是我正在做的: int stackptr; asm { LDR r0, =stackptr // put address of C vari

我试图在嵌入式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。我并不担心这一点,因为根据我的研究,它们似乎并不总是被使用


感谢您的帮助

尝试使
stackptr
易失性
,因为编译器可能认为它没有得到更新,并在寄存器中使用过时的副本,或者完全优化对它的访问


解决问题的另一种方法可能是让编译器计算可能的堆栈使用情况并创建报告。例如,对于GCC,您可以使用标志
-fstack usage
创建一个同名的
.su
文件,报告每个函数的堆栈使用情况
-Wstack usage=X
如果函数需要的堆栈多于传入的堆栈,则发出警告。当然,这是静态分析,所以编译器无法处理所有情况(但如果是,则生成警告)。如果您不使用GCC,我也希望任何商业编译器都具有这种功能。

这段代码是通过中断运行的吗?如果是这样,它可能有自己的堆栈(和堆栈指针)。您可能想看看。这是Cortex-M(只有一个)还是Cortex-a/旧的体系结构(最多有8个银行副本)?此外,是否涉及任何类型的操作系统或其他上下文切换?@EOF是正确的;在ISR中运行建议的代码只会提供ISR的SP,它可能有自己的堆栈。如果是这种情况,则必须找到被中断任务切换为中断上下文时其上下文被推送到的位置,并从保存的上下文中读取SP。如果仅在一个执行路径中调用此函数,则如果在多个不同位置调用此函数,则始终会产生相同的堆栈值(不同层次的嵌套函数)然后它应该显示出差异,volatile关键字很可能就是问题所在。