如何确定嵌入式系统上正在运行的C程序的当前堆栈和堆大小?另外,我怎样才能发现嵌入式系统允许的最大堆栈和堆大小?我想到线性调用malloc()的大小越来越大,直到它找不到堆大小,但是我对堆栈的大小更感兴趣。
我使用的是mbed NXP LPC1768,我使用的是在GitHub上开发的名为gcc4mbed的离线编译器。
有更好的想法吗?非常感谢所有帮助!
答案 0 :(得分:10)
为了查看链接器脚本,这将定义您为每个脚本分配了多少空间。
对于堆栈大小使用,请执行以下操作:
在内存初始化期间启动时(在C main()之前),将所有堆栈字节初始化为已知值,例如0xAA或0xCD。运行你的程序,你可以随时停下来看看你剩下多少魔法值。如果你没有看到任何魔法值,那么你的筹码就会溢出,并且可能会发生奇怪的事情。
在运行时,您还可以检查最后4个字节左右(也许最后两个字,这完全取决于您)。如果它们与您的魔法值不匹配,则强制重置。这仅适用于您的系统在重置时表现良好的情况,并且最好是快速启动并且不执行“实时”或关键任务。
这是关于这个主题的really helpful whitepaper from IAR。
答案 1 :(得分:5)
在运行时测量当前堆栈大小的粗略方法是声明
static void* mainsp;
然后用例如
开始你的main
int main(int argc, char**argv) {
int here;
mainsp = (void*) &here;
然后在一些叶子例程中,当调用堆栈足够深时,执行与
类似的操作 int local;
printf ("stack size = %ld\n",
(long) ((intptr_t) &local - (intptr_t) mainsp));
从应用程序的完整源代码中静态估计所需的堆栈大小通常是不可判定的(考虑递归,函数指针),并且在实践中非常困难(即使在严格限制的应用程序类中)。看看Couverture。您也可以考虑使用MELT来定制GCC用于此类目的,但这并不容易,并且会给您过度近似。
如果使用GCC进行编译,可以使用return address bultins在运行时查询堆栈帧指针。在某些体系结构中,它没有一些优化标志。
关于如何分配堆和堆栈空间,这取决于系统。您可以在Linux上解析/proc/self/maps
文件。