2017-06-17 13 views
1

プログラムのテキストの右に、外部計算なしでスタック上の非再帰関数の要求を判別することは可能ですか?私は、AVRのような非常に小さなマイクロコントローラ内のスレッド用のメモリリソースを割り当てるためにこれを必要とします。関数呼び出しの前にこれを知る必要があります。指令--stack-usageは有益ではありませんが、残念なことにあるいは私は何かが分からないのですか?GCCで呼び出される関数のツリーに必要なスタックサイズを計算する方法

+1

でEBPのプッシュのためのmy_fun()+マシンワードを呼び出すときに、戻りアドレスのプッシュのために距離+マシンワードを取得x86で-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()を呼び出します。それが役に立てば幸い。

編集:my_funの開始()がgccの中

+0

申し訳ありませんが、私は非常に詳細な質問はしていません。私は、AVRのような非常に小さなマイクロコントローラ内のスレッド用のメモリリソースを割り当てるためにこれを必要とします。関数呼び出しの前に知っておく必要があります。 – Vyacheslav

関連する問題