0

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 を使用しています

私の質問:

  1. 同じ変数に対して同じタスク内で2つの taskVarAdd() を使用するのは正しいですか?

  2. 同じタスク内の同じ変数に対して 2 つの taskVarAdd() が使用された場合の動作はどうなりますか?

  3. プログラムの流れを教えてください

4

1 に答える 1

1

taskVarAdd を 2 回追加するのは正しくないと言いたいです。

  1. まず、vxworks の実装ではこの状況に対処できませんでした (vxworks のソースを調べたところ、2 つの taskvar が同じアドレスを持つ場合、taskVar は 2 回設定され、値が間違っています。vxworks はソースに近いため、私はそうではありません)。ここにソースを貼り付けますが、vxworks の実装が間違っています)

  2. 次に、なぜ 2 回追加する必要があるのでしょうか。taskAddVar はアドレスを現在のタスク専用にします。タスクがスイッチ アウトすると、値はタスクの TCB に保存されます。タスクがスイッチバックされると、プライベートアドレスの値がコピーバックされます。そのため、同じアドレスでもタスクが異なれば値も異なります。

  3. vxworks は、タスク スイッチでタスクのプライベート変数を保存/設定するためのスイッチ フックを追加することで、taskVar メカニズムを実装します。これにより、同じルーチンが作成されますが、異なるタスク コンテキストで実行され、同じアドレスで異なるプライベート値を持つことができます。

于 2009-06-25T16:22:17.723 に答える