taskVarAdd() API を使用してグローバル構造体をタスクに追加しました。
ただし、一部のシナリオでは、同じグローバル構造体が taskVarAdd() API を使用して同じタスクに再度追加されます。[つまり、同じ変数に対してタスクから taskVarAdd() が 2 回呼び出される]。
この構造体は、そのタスクの taskID、メッセージ キュー ID を維持します。
以下は、シナリオを説明するために Benoit によって書かれたサンプル プログラムです。
int v1;
void tvl()
{
int i = 0;
v1 = 1;
taskVarAdd(0, &v1);
v1 = 2;
taskVarAdd(0, &v1);
v1 = 3;
タスク遅延 (1);
printf("初期 v1 = %d\n", v1);
for(i = 0;i<10;i++)
{
v1++;
taskDelay(60);
printf("v1 = %d\n", v1);
}
}
トルネードを使用してコードをテストしたところ、プログラムを実行するたびに異なる結果が得られました
//最初の試行 -> tv1
初期 v1 = V1 = 3
V1 = 3
V1 = 2
V1 = 4
V1 = 4
V1 = 3
V1 = 5
V1 = 5
V1 = 5
V1 = 6
// 2 回目の試行
-> tv1
初期 v1 = V1 = 1
V1 = 3
V1 = 4
V1 = 2
V1 = 4
V1 = 5
V1 = 3
V1 = 5
V1 = 6
しかし、2番目の taskVarAdd() にコメントしてテストすると、次のように一貫した期待される結果が得られます
//最初の試行
-> tv1
初期 v1 = 3
V1 = 4
V1 = 5
V1 = 6
V1 = 7
V1 = 8
V1 = 9
V1 = 10
V1 = 11
V1 = 12
V1 = 13
//2 回目の試行
-> tv1
初期 v1 = 3
V1 = 4
V1 = 5
V1 = 6
V1 = 7
V1 = 8
V1 = 9
V1 = 10
V1 = 11
V1 = 12
V1 = 13
VxWork 5.5 を使用しています
私の質問:
同じ変数に対して同じタスク内で2つの taskVarAdd() を使用するのは正しいですか?
同じタスク内の同じ変数に対して 2 つの taskVarAdd() が使用された場合の動作はどうなりますか?
プログラムの流れを教えてください