2017-06-17 29 views
1

在程序的正文中,是否可以确定堆栈上的非递归函数而无需外部计算?我需要这个为非常小的微控制器(如AVR)中的线程分配内存资源。在函数调用之前我需要知道这一点。指令 - 不幸的是,堆栈使用非常无用。或者我有些不明白?如何计算GCC中被调用函数的树的所需堆栈大小

+1

有调用my_fun()+机器字为EBP的推动时,你得到的距离+机器字的返回地址的推是-fstack-usage选项;它会报告每个函数的堆栈使用情况https://gcc.gnu.org/onlinedocs/gnat_ugn/Static-Stack-Usage-Analysis.html。另一个人写了一个脚本来计算调用树的堆栈使用情况https://github.com/PeterMcKinnis/WostCaseStack – MichaelMoser

+0

@MichaelMoser是的,但收到的值不考虑嵌套的调用。 – Vyacheslav

+0

我认为推进编译器会更好。 – Vyacheslav

回答

0

获取传递参数的地址会使其位于堆栈上。因此,运行以下命令:

#include <stdio.h> 

void my_fun(int dummy); 
int get_stack_space(int dummy); 

int main(void) 
{ 
    int dummy = 0; 

    my_fun(dummy); 

    return 0; 
} 

void my_fun(int dummy) 
{ 
    // do stuff 
    printf("%d\n", get_stack_space((int)&dummy)); 
    return; 
} 

int get_stack_space(int dummy) 
{ 
    return dummy - (int)&dummy; 
} 

应该给你打电话my_fun点之间的堆栈以字节为单位的距离()并调用get_stack_space()。希望能帮助到你。

编辑:在x86你)my_fun开始(在GCC

+0

对不起,我不是很详细的问这个问题。我需要这个为非常小的微控制器(如AVR)中的线程分配内存资源。它在函数调用之前需要知道。 – Vyacheslav

相关问题