• Imagix 4D ユーザガイド
  • 目次

[リエントラント関数] レポート

1つ以上のタスクから呼び出される関数は、[リエントラント関数] レポートにリスト表示されます。グローバル変数、静的変数、静的なローカル変数など、メモリ上に静的に割り当てられる変数を、書き込んだり読み取ったりする関数を呼び出すことにより、同じ関数を呼び出す別のタスクとの予期しない連動が発生することがあります。以下に例を示します。

int globalZ1, globalZ2;

void funcC() {}

void funcB() {
    int localB;
    globalZ2 = 2;
    /* 計算処理 */
    localB = globalZ2;
}

void funcA2() {}

void funcA1() {
    int localA1;
    globalZ1 = 1;
    /* 計算処理 */
    localA1 = globalZ1;
}

void funcA() {
    funcA1();
    funcA2();
}

void taskX() {
    funcA();
    DisableInt();
    funcB();
    EnableInt();
    funcC();
}

void taskY() {
    funcA();
    DisableInt();
    funcB();
    EnableInt();
    funcC();
}

[リエントラント関数] レポートでは、メンバ関数、再入関数、呼び出し先関数という用語が使用されます。メンバとは、タスクのルート関数、およびそのルートから直接的あるいは間接的に呼び出されるすべての関数など、タスクを構成する一連の関数を指します。共用関数は2つ以上のタスク間における共通のメンバ関数であり、再入関数あるいは呼び出し先関数のいずれかに分類されます。再入関数とは、1つ以上の非共用のメンバ関数によって呼び出される共用関数です。さらに、これらの関数はルート共用関数と見なされる場合もあります。また、呼び出し先関数とは別の共用関数にのみ呼び出される共用関数でもあるため、共用関数の呼び出し階層へのエントリが示されません。

レポートでは各再入関数のリストにおいて、再入関数をそれぞれ呼び出すタスクのみならず、該当の関数におけるクリティカルな領域内からの呼び出しの有無を表示します。さらに、この解析では、タスク間の潜在的な連動のレビューが可能です。

Reentrant Functions

Settings:
        Critical Region:              CR1 ( DisableInt / EnableInt )
                                      
        Protected Functions:          displayed
        Unprotected Functions:        displayed
        Functions not Using Globals:  displayed
        Library Functions:            displayed

Task Definitions
Tasks are from User Defined Tasks
Name            Members    Reentr   Callees  Root
TaskX             8 [+]     3 [+]     2 [+]  taskX
TaskY             8 [+]     3 [+]     2 [+]  taskY

Reentrant Function                                File (Line)
    Callees
          Task
             Line Number of Usage
                  Critical Region
                               User of Reentrant Function

funcA                                             reentr_funcs.c (21)
    funcA1                                            reentr_funcs.c (14)
    funcA2                                            reentr_funcs.c (12)
          TaskX
               27 U   (CR1) taskX                                       reentr_funcs.c (26)
          TaskY
               35 U   (CR1) taskY                                       reentr_funcs.c (34)

funcB                                             reentr_funcs.c (5)
          TaskX
               29 P   (CR1) taskX                                       reentr_funcs.c (26)
          TaskY
               37 P   (CR1) taskY                                       reentr_funcs.c (34)

funcC                                             reentr_funcs.c (3)
          TaskX
               31 U   (CR1) taskX                                       reentr_funcs.c (26)
          TaskY
               39 U   (CR1) taskY                                       reentr_funcs.c (34)

ここでは、問題の生じる可能性が高い再入関数を絞り込むなど、レポート結果をフィルタリングすることができます。グローバル変数のようなメモリ上に静的に割り当てられる変数を使用しない funcC などの関数は安全であり、デフォルト設定ではレポート結果に出力されません。

グローバル変数の使用が発生しても、クリティカルな領域を利用することにより、保護することが可能です。例えば、funcB への呼び出しに対する割り込み保護は、globalZ2 が設定されてから使用されるまでの間に、同変数が別のタスクにより変更されたり読み取られたりしないよう保護します。保護されたクリティカルな領域内の再入関数の使用は、一般的に保護されていない領域での使用と比べ安全なものであり、さらにフィルタリングで対象外とすることが可能です。これら2つのフィルタリングが適用された、同一のレポートの例を示します。

Reentrant Functions

Settings:
        Critical Region:              CR1 ( DisableInt / EnableInt )
                                      
        Protected Functions:          omitted
        Unprotected Functions:        displayed
        Functions not Using Globals:  omitted
        Library Functions:            displayed

Task Definitions
Tasks are from User Defined Tasks
Name            Members    Reentr   Callees  Root
TaskX             8 [+]     1 [+]     2 [+]  taskX
TaskY             8 [+]     1 [+]     2 [+]  taskY

Reentrant Function                                File (Line)
    Callees
          Task
             Line Number of Usage
                  Critical Region
                               User of Reentrant Function

funcA                                             reentr_funcs.c (21)
    funcA1                                            reentr_funcs.c (14)
          TaskX
               27 U   (CR1) taskX                                       reentr_funcs.c (26)
          TaskY
               35 U   (CR1) taskY                                       reentr_funcs.c (34)