【VxWorks系列】任务间同步与通信之共享内存

在开始之前先说明三个概念,任务间的同步,互斥,通信。
同步,是指一个任务等待某个条件发生,而另外一个任务引发这个条件后,等待的任务会被触发执行相应的处理。这就是一个任务与另一任务之间的同步控制。
互斥,是指两个以上任务要使用同一块内存数据或IO资源时引发的竞争状态。
任务间通信,很简单,就是使一个任务通过某个条件或某段数据与另一个任务发生联系时,就产生了通信,同步与互斥都是任务间通信的一种方式。

关于任务间的同步与通信方式,每个人脑子里会蹦出很多,信号量,互斥量,消息队列,管道,信号,事件等等,开始就从最简单的说起。

忽略VxWorks在6.X中开始支持进程的概念,在多数常规VxWorks的应用中所有的任务或内核都是运行在同一份线性内存中,所以这里的所谓共享内存的概念相对就非常简单,也就是对于所有你定义的全局或外部可见的数据,不同任务都可以操作,当然这个操作包含了读与写。比如你定义如下全局数据,那在所有任务就就可以操作my_data的值,
int my_data = 0;
也许你会觉得这个简直是废话,呵呵,慢慢来,前面说了从最简单的开始。(虽然很简单,但正因为所有任务都共享内存,使很多时候都是通过此种方式外加同步互斥的控制来实现的)

因为不管是抢占式还是时间片轮转调度,任务间都是可调度的,既然有了在多任务中对共享数据的读与写,而原生共享的数据单元并不具备对自身的保护与控制,所以这种情况下也就势必存在数据的竞态与互斥,需要我们额外的对共享的数据进行保护。

要避免任务间发生对数据竞争状态,第一种方式也是最直接的方式是使任务不可被切换,那么可以使用taskLock和taskUnlock,代码如下:
void fooA()
{
     taskLock();
.
. /* critical region of code that cannot be interrupted by other tasks */
.
     taskUnlock();
}
但是这种方式也是最不常见,不合理的一种方式。因为它阻止任务间的抢占,会破坏实时性,而且即使其他高优先级任务没有访问到该临界区数据,也会被阻止抢占。如果一定要使用,势必确保锁间的处理很短。在下一篇我们会介绍更优雅更合理更常见的处理方式------信号量。
原文地址:https://www.cnblogs.com/snake-hand/p/3187037.html