C嵌入式系统堆栈和堆大小

Cod*_*lus 4 c embedded heap system stack-size

如何确定嵌入式系统上正在运行的C程序的当前堆栈和堆大小?另外,我怎样才能发现嵌入式系统允许的最大堆栈和堆大小?我想到线性调用malloc()的大小越来越大,直到它找不到堆大小,但是我对堆栈的大小更感兴趣.

我使用的是mbed NXP LPC1768,我使用的是在GitHub上开发的名为gcc4mbed的离线编译器.

有更好的想法吗?非常感谢所有帮助!

Jos*_*itt 10

为了查看链接器脚本,这将定义您为每个脚本分配了多少空间.

对于堆栈大小用法执行此操作:

在初始化内存期间启动时(在C main()之前),将所有堆栈字节初始化为已知值,例如0xAA或0xCD.运行你的程序,你可以随时停下来看看你剩下多少魔法值.如果你没有看到任何魔法值,那么你的堆栈就会溢出,并且可能会开始出现怪异.

在运行时,您还可以检查最后4个字节左右(也许最后两个字,这真的取决于您).如果它们与您的魔法值不匹配,则强制重置.这仅适用于您的系统在重置时表现良好的情况,并且最好是快速启动并且不执行"实时"或关键任务.

这是IAR关于这个主题的非常有用的白皮书.


Bas*_*tch 5

在运行时测量当前堆栈大小的粗略方法是声明

 static void* mainsp;
Run Code Online (Sandbox Code Playgroud)

然后开始你main 的例如:

 int main(int argc, char**argv) {
    int here;
    mainsp = (void*) &here;
Run Code Online (Sandbox Code Playgroud)

然后在一些叶子例程中,当调用堆栈足够深时,做类似的事情

    int local;
    printf ("stack size = %ld\n", 
            (long) ((intptr_t) &local - (intptr_t) mainsp));
Run Code Online (Sandbox Code Playgroud)

从应用程序的完整源代码中静态估计所需的堆栈大小通常是不可判定的(考虑递归,函数指针),并且在实践中非常困难(即使在严格限制的应用程序类中).看看Couverture.您也可以考虑使用MELT为此目的定制GCC ,但这并不容易,并且会给您过度近似.

如果使用GCC进行编译,则可以使用返回地址bultins在运行时查询堆栈帧指针.在某些体系结构上,它没有一些优化标志.

至于如何分配堆和堆栈空间,这取决于系统.您可以/proc/self/maps在Linux上解析文件.

  • 您正在使用在堆栈上声明函数范围变量的事实,因此它的地址是当前堆栈指针,但您也可以使用[GCC的显式寄存器变量扩展](http://gcc.gnu. org/onlinedocs/gcc-4.4.2/gcc/Explicit-Reg-Vars.html)并编写`char*stack_ptr asm("sp");`获取当前堆栈指针的别名.在类似mbed的ARM Cortex-M3上,'sp'是堆栈指针的名称,但是您需要为其他架构更改此名称.如果你有很多局部变量,这将特别有用. (3认同)