[タスク間の変数フロー] レポート
[タスク間の変数フロー] レポートでは、タスク間の情報交換に使用されるグローバル変数と静的変数がレポートされ、変数を複数回にわたり設定したり読み取ったりするなど、潜在的に問題のある使用方法が検出されます。
問題となりうる使用方法の1つに、フィードバック・ループがあります。フィードバック・ループとは、あるタスクが次のタスクによって読み取られるグローバル変数を設定する、タスクとグローバル変数の間における相互作用を指します。この2番目のタスクは、次に別の(あるいは同じ)変数を設定し、それが次のタスクによって読み取られるのです。これは、最初のタスクが再度、関わるまで継続されます。
他のフローチェック・レポートと同様に、この解析によって必ずしも問題が提示されるとは限りませんが、タスクの相互作用のレビューに有益な情報を得ることができます。例として次のコードを示します。
int globalA, globalB, globalC, globalD;
int globalE, globalF, globalG;
void taskX() {
int localX1, localX2 = 1;
DisableInterrupt();
globalA = localX1;
globalB = localX1;
globalC = localX1;
EnableInterrupt();
localX2 = globalG;
globalE = localX2;
}
void taskY() {
int localY1, localY2 = 1;
DisableInterrupt();
globalA = localY1;
localY1 = globalB;
EnableInterrupt();
localY1 = globalB;
globalC = localY1;
localY2 = globalE;
globalF = localY2;
}
|
この例では、変数がタスク間で共有されていますが、レポートに表示されるように、実際にフィードバック・ループは存在しません。
タスク間の変数フロー
キー:
RまたはRR: タスクで変数が1回(R)または複数回(RR)読み取られる
SまたはSS: タスクで変数が1回(S)または複数回(SS)設定される
RSまたはRRSS: タスクで設定される前に変数が常に読み取られる
R *: 少なくとも1つのパスで変数が最初に読み取られる。設定されており、
さまざまな順序で読まれる
S *: 変数は、読み取られるすべてのパスで最初に設定される。それは
その後、さまざまな順序で設定および読み取られる
FnまたはFn ..: nというラベルのフィードバックループに関係する変数とタスク
設定:
重要な領域: 重要な領域が定義されていない
タスクセットなし: 表示
タスク読み取りなし: 表示
単一タスクセット/単一タスク読み取り: 表示
シングルタスクセット/マルチタスク読み取り: 表示
マルチタスクセット/シングルタスク読み取り: 表示
マルチタスクセット/マルチタスク読み取り: 表示
グローバル変数: 表示
静的変数: 表示
構造体コンテナの概要: 省略
共用体/ビットフィールドメンバー: 別途
フィードバックループ: 表示
組み合わせ使用リスト: オン
保護情報: オフ
タスク定義
タスクは自動タスク生成からのものです:任意のルート関数
名前 メンバー グラフ ルート
autotask 1 - taskX 1 [+] taskX
autotask 2 - taskY 1 [+] taskY
変数 Task1 Task2 Task3 ...
autotask 1 - taskX
. autotask 2 - taskY
--------------------------------------------- = =
globalA ..................................... S S
var_flow_simp.c (2)
globalB ..................................... S RR
var_flow_simp.c (2)
globalC ..................................... S S
var_flow_simp.c (2)
globalE ..................................... S R
var_flow_simp.c (3)
|
同時実行の問題から保護するために割り込みまたはセマフォの使用を反映するために重要な領域がタスク分析に定義されている場合、レポートは各変数が使用時に保護されるかどうかに関する情報を追加します。
タスク間の変数フロー
キー:
RまたはRR: タスクで変数が1回(R)または複数回(RR)読み取られる
SまたはSS: タスクで変数が1回(S)または複数回(SS)設定される
RSまたはRRSS: タスクで設定される前に変数が常に読み取られる
R *: 少なくとも1つのパスで変数が最初に読み取られる。設定されており、
さまざまな順序で読む
S *: 変数は、読み取られるすべてのパスで最初に設定される。それは
その後、さまざまな順序で設定および読み取られる
FnまたはFn ..: nというラベルのフィードバックループに関係する変数とタスク
P: 変数の使用は常にいくつかの重要な領域によって保護されている
P / U: 変数の使用はいくつかの重要な領域によって、保護される場合と
保護されていない場合がある
U: 変数の使用は、重要な領域によって常に保護されません
設定:
重要な領域: 割り込み ( 割り込み不可能 / 割り込み可能 )
タスクセットなし: 表示
タスク読み取りなし: 表示
単一タスクセット/単一タスク読み取り: 表示
シングルタスクセット/マルチタスク読み取り: 表示
マルチタスクセット/シングルタスク読み取り: 表示
マルチタスクセット/マルチタスク読み取り: 表示
グローバル変数: 表示
静的変数: 表示
構造体コンテナの概要: 省略
Union / Bitfieldメンバー: 別途
フィードバックループ: 表示
組み合わせ使用リスト: オフ
保護情報: オン
タスク定義
タスクは自動タスク生成からのものです:任意のルート関数
名前 メンバ グラフ ルート
自動タスク1-taskX 1 [+] taskX
自動タスク2-taskY 1 [+] taskY
変数 Task1 Task2 Task3 ...
autotask 1 - taskX
. autotask 2 - taskY
--------------------------------------------- = =
globalA .....................................S P S P
var_flow_simp.c (2)
globalB .....................................S P RR P/U
var_flow_simp.c (2)
globalC .....................................S P S U
var_flow_simp.c (2)
globalE .....................................S U R U
var_flow_simp.c (3)
|
次に示すコードでは、より多くのタスク間でさらに多くの変数が共有されており、フィードバック・ループが存在する可能性があります。
int globalA, globalB, globalC, globalD;
int globalE, globalF, globalG;
void taskV() {
int localV1 = 1;
globalD = localV1;
localV1 = globalD;
}
void taskW() {
int localW1 = 1;
globalD = localW1;
localW1 = globalD;
}
void taskX() {
int localX1, localX2 = 1;
globalA = localX1;
globalB = localX1;
globalC = localX1;
localX2 = globalG;
globalE = localX2;
}
void taskY() {
int localY1, localY2 = 1;
globalA = localY1;
localY1 = globalB;
globalC = localY1;
localY2 = globalE;
globalF = localY2;
}
void taskZ() {
int localZ2;
localZ2 = globalF;
globalG = localZ2;
}
|
コードに潜在的なフィードバック・ループがある場合はレポートに表示され、どのタスク / 変数の使用方法が、どのフィードバック・ループに対応するかを、F(x)で示します。
タスク間の変数フロー
キー:
RまたはRR: タスクで変数が1回(R)または複数回(RR)読み取られる
SまたはSS: タスクで変数が1回(S)または複数回(SS)設定される
RSまたはRRSS: タスクで設定される前に変数が常に読み取られる
R *: 少なくとも1つのパスで変数が最初に読み取られる。 設定されており、
さまざまな順序で読まれる
S *: 変数は、読み取られるすべてのパスで最初に設定される。 それは
その後、さまざまな順序で設定および読み取られる
FnまたはFn ..: nというラベルのフィードバックループに関係する変数とタスク
設定:
重要な領域: 重要な領域が定義されていない
タスクセットなし:表示
タスク読み取りなし: 表示
単一タスクセット/単一タスク読み取り: 表示
シングルタスクセット/マルチタスク読み取り: 表示
マルチタスクセット/シングルタスク読み取り: 表示
マルチタスクセット/マルチタスク読み取り: 表示
グローバル変数: 表示
静的変数: 表示
構造体コンテナの概要: 省略
共用体/ビットフィールドメンバー: 別途
フィードバックループ: 表示
組み合わせ使用リスト: オン
タスク定義
タスクは自動タスク生成からのものです:任意のルート関数
名前 メンバー グラフ ルート
autotask 1 - taskV 1 [+] taskV
autotask 2 - taskW 1 [+] taskW
autotask 3 - taskX 1 [+] taskX
autotask 4 - taskY 1 [+] taskY
autotask 5 - taskZ 1 [+] taskZ
変数 Task1 Task2 Task3 ...
autotask 1 - taskV, autotask 2 - taskW
. autotask 3 - taskX
. . autotask 4 - taskY
. . . autotask 5
--------------------------------------------- = = = =
globalA ..................................... . S S .
globalB ..................................... . S F1 R F1 .
globalC ..................................... . S S .
globalD ..................................... SR . . .
globalE ..................................... . S F1 R F1 .
globalF ..................................... . . S F1 R F1
globalG ..................................... . R F1 . S F1
|
|