0

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

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

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

以下是 Benoit 编写的用于解释该场景的示例程序,

诠释v1;

无效的电视()

{

诠释 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);

}

}

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

//第一次尝试 -> tv1

初始 v1 = V1 = 3

V1 = 3

V1 = 2

V1 = 4

V1 = 4

V1 = 3

V1 = 5

V1 = 5

V1 = 5

V1 = 6

//第二次尝试

- >电视1

初始 v1 = V1 = 1

V1 = 3

V1 = 4

V1 = 2

V1 = 4

V1 = 5

V1 = 3

V1 = 5

V1 = 6

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

//第一次尝试

- >电视1

初始 v1 = 3

V1 = 4

V1 = 5

V1 = 6

V1 = 7

V1 = 8

V1 = 9

V1 = 10

V1 = 11

V1 = 12

V1 = 13

//第二次尝试

- >电视1

初始 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. 请解释您的程序流程

4

1 回答 1

1

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

  1. 首先,vxworks的实现没有处理这种情况。(我查了vxworks源码,当两个taskvar地址相同时,taskVar会设置两次,会得到错误的值。由于vxworks是close source,所以我没有将在此处粘贴源代码,但这是 vxworks 的实现出错了)

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

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

于 2009-06-25T16:22:17.723 回答