1.共享内存

双向链表

VxWorks任务间通信_第1张图片

环形缓冲

VxWorks任务间通信_第2张图片

2.互斥

中断锁:作用域仅限于中断内部。

优先级锁:共享内存中,低优先级的任务不允许被打断,优先级锁就被使用。弊端:会完全禁止任务的调度。

3.信号量(一种指向semaphore结构的指针)

VxWorks任务间通信_第3张图片

VxWorks任务间通信_第4张图片

SEM_EVENTSEND_ERR_NOTIFY,释放信号量出错返回错误;SEM_DELETE_SAFE模式避免拥有信号量的任务被删除;SEM_INVERSION_SAFE避免系统出现优先级反转现象。

SEM_ID semId;//声明信号量

semId = semXCreate(SEM_Q_PRIORITY,SEM_EMPTY);创建信号量

1)二值信号量

速度最快,只有唯一的任务可以获取,一个任务释放,一个任务才能获取

2)互斥信号量

特殊二值信号量,只有拥有信号量的任务,才能使用semGIve释放信号量;二值信号量和计数信号量,所有的任务都能释放信号量;二值信号量被释放之前只能有一个任务使用semTake获取信号量;计数信号量被释放前可以有多个任务获取信号量,上限是计数值;在互斥信号量中,也只有一个任务获取信号量,但是允许同一个任务联系多次获取中一个信号量,当然获取多少次就释放多少次;二进制信号量和计数信号量均指出semFlush操作,用于向所有等待信号量的任务释放信号量,使他们进入就绪态,信号量本身不变,但是,互斥信号量不支持semFlush。

3)计数信号量

和二值信号量类似,但是一个信号量可以被多个任务后去知道计数的限制。

4.消息队列

创建一个队列,一个任务发送,一个任务接收,队列有大小,通过创建的队列返回的句柄来发送和接收消息。

VxWorks任务间通信_第5张图片

msgQCreate创建消息队列,属性:先进先出MSG_Q_FIFO、消息优先级MSG_Q_PRIORITY、发送时间通知MSG_Q_EVENTSEND_ERR_NOTIFY,前两个可以和第三个属性组合。返回值就是队列句柄,也就是发送和接收函数操作队列的参数。

msgQsend向队列中发送消息,紧急程度参数:普通消息MSG_PRI_NORMAL和紧急消息MSG_PRI_URGENT。紧急就是将消息放到前端。

接收使用WAIT_FOREVER作为超时参数,则消息队列引起任务阻塞,知道队列中有消息。

5.管道

支持select机制可以用于异步通信、支持全双工

status = pipeDevCreate("/pipe/pipe0",Max_MsgNo,Max_MsgLen);

通过,open(),read(),write(),ioctl()来访问管道。

6.socket

和Linux类似,之前已总结过

7.信号

VxWorks任务间通信_第6张图片