0

注: 私の質問が明確ではなかったことを認識しています。私は今それを修正しました。そもそも間違いを犯してしまったことをお詫びします。

組み込みシステムで実行する大規模なC プロジェクトがあります。私はARMコンパイラを使用しています。コードは複数のサブフォルダーにまたがっており、.c および .h ファイルで構成されています。

デッドコードを特定し、最も頻繁に使用される関数を高速化できるように、どの関数が何回呼び出されたかを把握したいと考えています。ARM コンパイラには、到達不能なコードを削除するためのいくつかのオプションがあり、関数ポインタが作用すると失敗します。そのため、コードのすべての分岐を調べて、関数への呼び出し回数を数えたいと思います。

例(これは、元のコードではなく、探しているものを示すための非常に単純なプログラムです):

void foo1(void)
{
    printf("Number is divisible by 5");
}
void foo2(void)
{
    printf("Number is divisible by 10");
}
void foo3(void)
{
    printf("Number is divisible by neither 10 nor 5");
}
void foo4(void)
{
    printf("foo4 called");
}


int main (void)
{
    int x;

    x = rand (11);

    if (! x%10)
    {
        foo2();
        foo1();
    }
    else if (! x%5)       foo1();
    else             foo3();

    return 0;
}

if ブランチのすべてのセクション (つまり、foo1、foo2、および foo3) にアクセスできるように、コード全体を実行したいと考えています。これは、どの関数が何回呼び出されたかを特定するのに役立ちます。上記の例では、foo1() は foo2() より頻繁に呼び出され、foo4() は呼び出されません。したがって、foo4() を特定して削除し、foo1() を最適化することは理にかなっています。

コード全体を実行するためのアイデア/ツールはありますか?

私が考えた方法の 1 つは、メイン関数を次のように変更することでした。

int main (void)
{
    int x ;

    x = rand (11);

    //*************************************************
    //starting modification
    int a = 1; //added by me
    if_1: //added by me
    if (a == 1)
    {
        foo1(); //original code
        foo2(); //original code

        a=2; //added by me
        goto if_1; //added by me
    }

    else if (a==2)
    {
        foo2(); //original code
        a=3; //added by me
        goto if_1: //added by me
    }
    else             foo3(); //original code
    //end of modification
    //********************************************************        

    return 0;
}

このようにして、元のコードを実行します。このタイプの変更方法について何か考えはありますか?

4

3 に答える 3

0

main()この方法でも関数を変更できます

int main (void)
{
    int x = 5;
    while () {
       if (x==5)        { foo1(); x=10;}
       else if (x==10)  { foo2(); x=0; }
       else             { foo3(); break;}
    }
    return 0;
}
于 2013-07-11T08:06:15.523 に答える