[リエントラント関数] レポート
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)
|
|