taskVarAdd对同一个变量使用了两次

时间:2009-06-25 15:34:59

标签: vxworks

我使用taskVarAdd()API将一个全局结构添加到我的任务中。

但在某些情况下,使用taskVarAdd()API将相同的全局结构再次添加到同一任务中。 [即,从同一变量的任务中调用taskVarAdd()两次]。

此结构将维护该任务的taskID,消息队列ID

以下是Benoit解释情景的示例程序,

int v1;

void tvl()

{

int i = 0;

v1 = 1;

taskVarAdd(0,& v1);

v1 = 2;

taskVarAdd(0,& v1);

v1 = 3;

taskDelay(1);

printf(“Initial v1 =%d \ n”,v1);

表示(i = 0; i <10; i ++)

{

 v1++;

 taskDelay(60);

 printf("v1 = %d\n", v1);

}

}

当我使用龙卷风测试代码时,每次执行程序时都会得到不同的结果

//第一次尝试 - &GT; tv1

初始v1 = V1 = 3

V1 = 3

V1 = 2

V1 = 4

V1 = 4

V1 = 3

V1 = 5

V1 = 5

V1 = 5

V1 = 6

//第二次尝试

- &GT; tv1

初始v1 = V1 = 1

V1 = 3

V1 = 4

V1 = 2

V1 = 4

V1 = 5

V1 = 3

V1 = 5

V1 = 6

但是当我评论第二个taskVarAdd()并测试它时,我得到了一致的预期结果如下

//第一次尝试

- &GT; tv1

初始v1 = 3

V1 = 4

V1 = 5

V1 = 6

V1 = 7

V1 = 8

V1 = 9

V1 = 10

V1 = 11

V1 = 12

V1 = 13

//第二次尝试

- &GT; 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. 在同一个任务中为同一个变量使用两个taskVarAdd()是否正确?

  2. 如果在同一任务中将两个taskVarAdd()用于同一个变量,会有什么行为?

  3. 请解释您的计划流程

1 个答案:

答案 0 :(得分:1)

我想说两次添加taskVarAdd是不对的:

  1. 首先,vxworks的实现没有处理这种情况。(我检查了vxworks源代码,当两个taskvar具有相同的地址时,taskVar将设置两次,这将导致值错误。当vxworks关闭时来源,所以我不打算在这里粘贴源代码,但这是vxworks的实现使它错了)

  2. 第二,你为什么需要加两次? taskAddVar使一个地址对当前任务是私有的,当任务切换出来时,该值保存到任务的TCB;当任务切换回来时,私有地址的值将被复制回来。因此,即使在同一地址,不同的任务也会有不同的价值。

  3. vxworks通过添加一个switch钩子来实现taskVar机制,使任务的私有var在任务切换时保存/设置,这使得相同的例程但在不同的任务上下文中运行可以在同一地址具有不同的私有值。