VxWorks任务间通信

简介:

1.共享内存

双向链表

1.png

环形缓冲

2.png

2.互斥

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

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

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

3.png

4.png

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.消息队列

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

5.png

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.信号

6.png



本文转自 8yi少女的夢 51CTO博客,原文链接:http://blog.51cto.com/zhaoxiaohu/2047612,如需转载请自行联系原作者

相关文章
VSCode如何自动换行,右侧换行间距长度,隐藏右侧代码预览(Minimap代码缩略图滚动条),比对代码差异窗口也自动换行
VSCode如何自动换行,右侧换行间距长度,隐藏右侧代码预览(Minimap代码缩略图滚动条),比对代码差异窗口也自动换行
|
10月前
|
缓存 监控 关系型数据库
如何根据监控结果调整 MySQL 数据库的参数以提高性能?
【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
293 1
|
10月前
|
存储 UED 开发者
Flutter鸿蒙版本灵活使用方法间的回调处理复杂化的逻辑
在 Flutter 开发中,灵活使用函数回调可以提高代码的可重用性、简化异步编程、增强解耦设计和提升用户体验。本文通过一个简单的示例,展示了如何在 Flutter 中实现函数调用和回调的基本使用。示例代码包括主入口、页面组件和回调函数的定义与调用,详细解析了每个部分的功能和作用。通过这种方式,开发者可以在操作完成后执行特定逻辑,使代码更易读和维护。
207 0
|
存储
在 Web 中判断页面是不是刷新
【9月更文挑战第10天】在Web开发中,判断页面是否刷新有多种方法:1) 监听`popstate`事件,检测用户是否通过历史记录访问页面;2) 记录并比较页面加载时间戳,若相差极小,则可能为刷新;3) 利用本地存储设置特定值,若该值不存在或不符合预期,则页面可能被刷新。然而,这些方法并非绝对准确。
504 3
|
Ubuntu Linux 编译器
通过qemu和docker搭建交叉编译环境
通过qemu和docker搭建交叉编译环境
|
存储 SQL 网络协议
ClickHouse(05)ClickHouse数据类型详解
ClickHouse是一款分析型数据库,支持基础、复合和特殊数据类型。基础类型包括数值(Int、Float、Decimal)、字符串(String、FixedString、UUID)和时间(DateTime、DateTime64、Date)类型。数值类型如Int8-64和Float32-64,Decimal提供高精度计算。字符串中的FixedString有固定长度,UUID作为主键。时间类型最高精度到秒。复合类型有数组、元组、枚举和嵌套,其中数组和元组允许不同数据类型,枚举节省空间,嵌套类型是多维数组结构。特殊类型如Nullable表示可为空,Domain封装IPv4和IPv6。
764 1
ClickHouse(05)ClickHouse数据类型详解
|
C++
CMake教程8:在Vscode中使用CMake
CMake教程8:在Vscode中使用CMake
977 0
|
消息中间件 算法 数据处理
深入Flink系列——watermark使用与源码详解
# 1 Flink时间体系 本节我们主要关注Flink的时间体系,包括Flink的时间语义、watermark机制及watermark的生成与传播原理,主要进行一些flink watermark理论知识的梳理。 ## 1.1 Flink的时间语义 Flink支持三种时间概念:EventTime/ProcessingTime/IngestionTime,即事件时间、处理时间、摄入时间。 ![imag
3278 0
深入Flink系列——watermark使用与源码详解
|
XML 数据格式 C++
protobuf C++ 使用示例
1、在.proto文件中定义消息格式 2、使用protobuf编译器 3、使用c++ api来读写消息   0、为何使用protobuf?   1、原始内存数据结构,可以以二进制方式sent/saved.这种方式需要相同的内存布局和字节序。
8560 0