2024年最全VxWorks消息队列详解(1),别再说你不会

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

文章目录

一、前言

最近看了点事件驱动编程。了解到在时间驱动编程中,重要的是一个事件收集器、一个事件发送器和一个事件处理器。

这让我联想到VxWorks中的消息队列,控制发送的就是事件收集器,控制接收的就是事件发送器。

下面就一起来看看VxWorks消息队列相关的函数。

源码面前无细节,正好我有VxWorks5.5的源码,可以来看一下消息队列模块的实现。

想要下载VxWorks5.5的源码:

链接: 点击此处
提取码:trc5


二、VxWorks消息队列模块详解

VxWorks的消息队列模块包括源文件msgQLib.h和msgQLib.c。

为了控制文章篇幅和易于阅读,我将msgQLib.h的主要内容复制过来,了解一下消息队列模块的数据结构和函数方法。

msgQLib.h

typedef struct			/\* MSG\_Q\_INFO \*/
    {
    int     numMsgs;		/\* OUT: number of messages queued \*/
    int     numTasks;		/\* OUT: number of tasks waiting on msg q \*/

    int     sendTimeouts;	/\* OUT: count of send timeouts \*/
    int     recvTimeouts;	/\* OUT: count of receive timeouts \*/

    int     options;		/\* OUT: options with which msg q was created \*/
    int     maxMsgs;		/\* OUT: max messages that can be queued \*/
    int     maxMsgLength;	/\* OUT: max byte length of each message \*/

    int     taskIdListMax;	/\* IN: max tasks to fill in taskIdList \*/
    int \*   taskIdList;		/\* PTR: array of task ids waiting on msg q \*/

    int     msgListMax;		/\* IN: max msgs to fill in msg lists \*/
    char \*\* msgPtrList;		/\* PTR: array of msg ptrs queued to msg q \*/
    int \*   msgLenList;		/\* PTR: array of lengths of msgs \*/

    } MSG_Q_INFO;


extern STATUS 	msgQLibInit (void);
extern MSG_Q_ID msgQCreate (int maxMsgs, int maxMsgLength, int options);
extern STATUS 	msgQDelete (MSG_Q_ID msgQId);
extern STATUS 	msgQSend (MSG_Q_ID msgQId, char \*buffer, UINT nBytes,
			  int timeout, int priority);
extern int 	msgQReceive (MSG_Q_ID msgQId, char \*buffer, UINT maxNBytes,
			     int timeout);
extern STATUS 	msgQInfoGet (MSG_Q_ID msgQId, MSG_Q_INFO \*pInfo);
extern int 	msgQNumMsgs (MSG_Q_ID msgQId);
extern void 	msgQShowInit (void);
extern STATUS 	msgQShow (MSG_Q_ID msgQId, int level);

要使用VxWorks的消息队列,需要包含头文件

#include <msgQLib.h>

下面对主要函数API的使用方法进行一下讲解。

  1. msgQCreate 创建一个消息队列
MSG_Q_ID msgQCreate
    (
    int maxMsgs,            /\*队列中存储的最大消息数目\*/
    int maxMsgLength,       /\*每个消息的最大字节数\*/
    int options             /\*消息在消息队列中的排列方式\*/
    )

options一般有两个选项:
MSG_Q_FIFO 表示消息以先进先出的方式在队列中
MSG_Q_PRIORITY 表示消息以优先级的方式在队列中,高优先级的消息会直接送到队列顶端
返回一个MSG_Q_ID类型的队列ID。

  1. msgQSend 向一消息队列发送消息包
STATUS msgQSend
    (
    MSG_Q_ID msgQId,    /\* 要发送信息的队列id\*/
    char \*   buffer,    /\* 要发送的信息 \*/
    UINT     nBytes,    /\* 要发送信息的长度(字节),即sizeof(buffer) \*/
    int      timeout,   /\* 消息进入队列的等待时间 \*/
    int      priority   /\* 该消息的优先级 \*/
    )

timeout意思是:当消息队列已满时,等待消息队列有空间时所等待的时间。超过该时间还没空间可用的话,消息包被舍弃。它有两个特殊值:NO_WAIT(0)立即返回,不管消息包是否被发送;WAIT_FOREVER(-1)一直等待消息队列有空间可用。
priority表示:指明发送的消息的优先级,可能值有:MSG_PRI_NORMAL(0)正常优先级,将消息置于消息队列的尾部;MSG_PRI_URGENT(1)紧急消息,将消息置于消息队列的首部。
返回一个STATUS状态值

  1. msgQReceive从队列接收消息
int msgQReceive
    (
    MSG_Q_ID msgQId,      /\* 接收消息的队列的ID \*/
    char \*   buffer,      /\* 接收消息字节缓冲区 \*/
    UINT     maxNBytes,   /\* 接受字节的最大长度 \*/
    int      timeout      /\* 等待时间 \*/
    )

该函数从消息队列msgQId接收消息,将其拷贝到最大长度为maxNBytes的缓冲区buffer。如果消息包长度超过maxNBytes,多余部分被舍弃。等待时间timeout有两个特殊值: NO_WAIT(0)立即返回,WAIT_FOREVER(-1)一直等待消息队列有消息可取。
返回接收到的buffer的字节大小或者ERROR

  1. msgQDelete 删除一个消息队列
STATUS msgQDelete
   (
   MSG_Q_ID msgQId      /\*要删除的队列ID\*/
   )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EUUYU7gs-1638607332359)(https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20211203231804481.png)]

image-20211203231819363

image-20211203231837651

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BCc3lL8e-1638607332361)(https://raw.githubusercontent.com/xkyvvv/blogpic2/main/img/image-20211203231901964.png)]

三、代码实例

要实现跑VxWorks的代码,我们需要安装tornado集成开发环境,这个开发环境支持xp和win7 32位操作系统,考虑到我们现在的PC一般都是Windows10操作系统,因此我们可以考虑使用VMware来安装一个win7 32位。

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值