VxWorks消息队列详解

2023-05-16

文章目录

    • 一、前言
    • 二、VxWorks消息队列模块详解
    • 三、代码实例

一、前言

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

这让我联想到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位。

安装教程我当时是参考的:

tornado2.2安装教程

Tornado2.2安装教程


注意代码中不要使用 // 注释,tornado2.2默认是不支持的。

  
#include "vxWorks.h"    
#include "msgQLib.h"   
    

#define MAX_MSGS (10)    
#define MAX_MSG_LEN (100)   
    
MSG_Q_ID myMsgQId;   
   

task3(void)   
{   

    if ((myMsgQId = msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY)) == NULL)    
        return (ERROR);   
}   
    

task2 (void)    
{    
    char msgBuf[MAX_MSG_LEN];   
    
    

    if (msgQReceive(myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_FOREVER) == ERROR)    
        return (ERROR);   
    

    logMsg ("Message from task 1:\n%s\n", msgBuf, 0,0,0,0,0);
}   
    

#define MESSAGE "Greetings from Task 1"    
task1 (void)    
{    
	taskDelay (sysClkRateGet()*5);
	
   if (msgQSend (myMsgQId, MESSAGE, MAX_MSG_LEN, WAIT_FOREVER,    
                  MSG_PRI_NORMAL) == ERROR)    
        return (ERROR);    
   
}   
    
void TestMsgQ(void)   
{   
	taskSpawn("t3",100,0,0x20000,(FUNCPTR)task3,0,0,0,0,0,0,0,0,0,0);   
	taskSpawn("t2",100,0,0x20000,(FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0);   
	taskSpawn("t1",100,0,0x20000,(FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0);   
}   
   
   

启动shell,输入

sp TestMsgQ

-> sp TestMsgQ
task spawned: id = 38092b0, name = s2u0
value = 58757808 = 0x38092b0

然后输入 i,查看此时操作系统有几个任务在运行。

-> i
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY


tExcTask _excTask 3818dd8 0 PEND 408358 3818cd8 0 0
tLogTask _logTask 38132a8 0 PEND 408358 38131a8 0 0
tWdbTask _wdbTask 380e660 3 READY 408358 380e510 0 0
t2 _task2 37ddde0 100 PEND 408358 37ddc94 0 0
t1 _task1 37baa88 100 DELAY 408358 37ba9dc 0 195
value = 0 = 0x0

后面两个任务 t2,t1就是我们创建的任务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VxWorks消息队列详解 的相关文章

  • ZYNQ移植vxworks系统

    版本 xff1a ZYNQ7010 xff0c VxWorks 6 9 ZYNQ PL端有灵活性好 xff0c 资源丰富 xff0c 可反复编程速度快的优势 xff0c 通过 PS的外设并行 AXI总线外挂 PL接口 xff0c 使用 FP
  • Vxworks 学习(一)介绍

    Vxworks 学习 xff08 一 xff09 介绍 该系列文章是我根据多个博主以及相关书上内容整理的学习笔记 xff0c 许多内容非原创 实时操作系统 定义 实时操作系统 xff08 Real Time Operating System
  • 【VxWorks 6.x之FTP服务器】

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 FTP是什么 xff1f 二 使用步骤使用FTP需要添加的组件 最后就可以通过FTP软件去访问VxWorks FTP服务
  • VxWorks 操作系统简介

    实时多任务操作系统是能在确定的时间内执行其功能 xff0c 并对外部的异步事件作出响应的计算机系统 多任务环境允许一个实时应用作为一系列独立任务来运行 xff0c 各任务有各自的线程和系统资源 VxWorks系统提供多处理器间和任务间高效的
  • VxWorks中的任务和进程线程的关系

    学过操作系统的 xff0c 对进程和线程应该是比较了解的 但是为了文章知识的完整性 xff0c 笔者先对操作系统中的进程和线程进行一些介绍 1 进程和线程的关系 为了不产生歧义 xff0c 先对一些易混淆的概念进行介绍 xff1a 代码 x
  • VxWorks和Tornado教程书籍分享

    搞VxWorks的是个小圈子 xff0c 找点学习资料还是有点麻烦的 博主花费了好大的精力才收集到这二十多本书籍 xff0c 下面统统免费分享给大家 xff08 百度网盘链接在文章结尾处 xff09 书籍清单如下 xff1a ARM嵌入式V
  • VxWorks的信号量机制分析

    VxWorks 的信号量机制分析 VxWorks 信号量是提供任务间通信 同步和互斥的最优选择 xff0c 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 VxWorks 提供 3 种信号量来解决不同的问题 二进制信号量 xff
  • 第九课: 工作空间-Work Space介绍

    2 7 工作空间 Work Space介绍 工作空间是WorkBench3 3集成开发环境对项目工程进行集中管理的空间 用户创建的BootRom工程 VxWorks工程 Downloadable工程和静态库工程等都存在于Work Space
  • VxWorks开发俱乐部

    VxWorks开发俱乐部
  • VxWorks的环境配置

    转载请标记出处 http blog csdn net zgh1988 article details 7994538 1 准备工作 1 VMWare 2 一台安装Windows XP或Window 7系统的PC机 3 Tornado 2 2
  • 【VxWorks】Vxworks、QNX、Xenomai、Intime、Sylixos、Ucos等实时操作系统的性能特点

    目录 1 VxWorks操作系统 2 QNX操作系统 3 Xenomai操作系统 4 INtime操作系统 5 SylixOS操作系统 5 1 SylixOS官网
  • VxWorks任务挂死实战分析

    目录 背景描述 根本原因 分析过程 背景描述 操作系统 VxWorks 5 5 CPU MIPS32 74Kc内核CPU 现象描述 联调代码时发现应用层代码调用以下接口函数必现任务挂死 检查代码发现入参均合法 代码逻辑没问题 未发现异常 F
  • 【无标题】vxworks ARM Pl330DMA 数据传输指令流创建

    pl330DmaChanMicroCodeCreate create micro code for dma transfer This routine create micro code for dma transfer RETURNS O
  • 打开FTP server或者wftpd32提示 unknow error 10013

    打开FTP server或者wftpd32提示 unknow error 10013 问题描述 解决方法 重启ftp 参考 问题描述 近期在进行vxworks的相关环境搭建时打开FTP server总提示unknow error 由于没有详
  • 第四课:创建VxWorks系统镜像

    目录 2 2 2 创建VxWorks系统镜像 2 2 2 1 VxWorks概述 2 2 2 2 创建VxWorks6 9工程 zynq7000 2 2 2 3 创建VxWorks6 9工程 P2020
  • 将 DKM 项目链接到内核映像 (VIP) 项目作为 VxWorks Workbench4 中的子项目/额外模块

    如何将 DKM 项目与内核映像 VIP 项目链接 加载 以便我可以从内核映像项目的 usrAppInit c 调用 DKM 项目 应用程序 的入口点函数 以在启动时自动启动应用程序 有人可以描述步骤或向我指出任何文档吗 将 DKM 项目添加
  • vxworks 中的 C++ 11

    我是VxWorks的新手 我正在VxWorks平台上使用C 开发一个软件 我想知道VxWorks编译器是否支持C 11标准 我问这个问题的原因是因为没有可用的shrink to fit std vector 函数 该函数是在c 11 标准中
  • 一个任务如何在多个 vxworks 队列上等待?

    我们有一个 vxWorks 设计 需要一个任务来处理来自两个消息队列 Q1 和 Q2 的消息 我们希望在两个队列上等待 无论哪个队列收到消息 都处理队列中的消息 我们希望避免轮询队列或使用可能导致其他队列填满的超时值 有没有办法做到这一点
  • 编译先前预处理的文件会更改输出

    我有一个源文件 我使用选项对其进行预处理 E and P 对于基于 vxWorks 的嵌入式平台使用 GCC 4 1 2 所有其他选项与我编译文件时相同 这些选项是 Wall march pentium nostdinc O0 fno bu
  • 如何限制客户端服务器程序的连接数

    我想要一个服务器程序 它应该只接受最多一个连接 并且应该丢弃其他连接 我怎样才能实现这个目标 Only accept 单个连接 这是一个典型的服务器例程 s socket bind s listen s backlog while 1 t

随机推荐