rtems 的消息与消息队列管理器

news/2024/11/20 21:29:40/

作者 Ray

 

RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray

 

14.1: 介绍

 

消息管理器提供任务间通信和使用 RTEMS 消息队列同步的能力。由消息管理器提供的函数是:

 

rtems_message_queue_create-创建一个消息队列

 

rtems_message_queue_ident-获取消息队列的 ID标识

 

rtems_message_queue_delete-删除一个消息队列

 

rtems_message_queue_send-将消息放入消息队列的尾部

 

rtems_message_queue_urgent-将消息放入消息队列的前面

 

rtems_message_queue_broadcast-对一个队列广播多个个消息

 

rtems_message_queue_receive-接受来自消息队列的消息

 

rtems_message_queue_get_number_pending-获取队列上的消息个数

 

rtems_message_queue_flush-清空消息队列上的所有消息

 

14.2: 背景知识

 

14.2.1 : 消息

 

消息是一个可变长度缓冲区,用于存储任务间通信的信息。消息的长度和信息是用户定义的,可以是是真实的数据,指针, 或为空。

 

14.2.2 : 消息队列

 

消息队列允许在任务或者ISR之间传递信息。消息队列能包含零个或者多个消息。通常,任务使用 rtems_message_queue_send 函

数按照的 FIFO次序收发消息。此外,rtems_message_queue_urgent函数可以将消息放在队首。

 

任务间可以通过消息队列实现任务间的同步。任务等待消息的方式有轮询和死等两种。

 

消息的最大长度在消息队列中定义。

 

14.2.3 : 消息队列属性集合

 

和RTEMS其他对象相同,消息队列属性也是用属性分量构造的:

 

RTEMS_FIFO- 任务按照 FIFO 等候 (默认)

 

RTEMS_PRIORITY- 任务按照优先级等候

 

RTEMS_LOCAL- 本地消息队列 (默认)

 

RTEMS_GLOBAL- 全局消息队列

 

属性 RTEMS_DEFAULT_ATTRIBUTES 用于代表系统默认属性。

 

下面是构造attribute_set参数的例子:

 

如果需要创建一个本地消息队列,获取消息的任务按照优先级排序。那么rtems_message_queue_create函数的attribute_set参数可

以是 RTEMS_PRIORITY 或者 RTEMS_LOCAL|RTEMS_PRIORITY 。如果构建全局的按照优先级排序的消息队列,那么

attribute_set参数就是 RTEMS_GLOBAL|RTEMS_PRIORITY 。

 

14.2.4 :MESSAGE_QUEUE_RECEIVE选项

 

rtems_message_queue_receive函数的接受选项可以是:

 

RTEMS_WAIT- 任务将会等候一个消息 (默认)

 

RTEMS_NO_WAIT- 任务不等候,直接返回

 

可以使用RTEMS_DEFAULT_OPTIONS表示缺省的选项。

 

14.3 消息队列操作

14.3: 操作

 

创造一个消息队列

获得消息队列 ID标识

从队列中接收消息

向队列发送消息

广播消息

删除消息队列

14.3.1 : 创造消息队列

 

rtems_message_queue_create函数用来创建一个用户命名的消息队列。 用户定义消息最大长度和消息队列的长度。用户可以指定

等待消息的任务排序方法(FIFO或者优先级排序)。创建队列后,RTEMS从空闲链表中为队列分配 队列控制块(QCB)用于维护

队列信息,同时也会创建消息队列 ID标识。

 

对于全局消息队列,最长的消息长度被MPCI限制。

 

14.3.2 : 获得消息排队 ID标识

 

当一个消息队列创建时,RTEMS 产生一个唯一的消息队列 ID标识。消息队列 ID标识可使用二种方法获得。 首先,

 rtems_message_queue_create 函数的参数返回,其次,使用 rtems_message_queue_ident 函数获取。

 

14.3.3 : 获取消息

 

rtems_message_queue_receive函数从指定的消息队列获取一个消息。 如果队列中至少有一个消息,那么该函数会从队列中摘除该

消息,并且将信息内容拷贝到任务的缓存区中。如果队列中没有消息,那么如果设置了 RTEMS_NO_WAIT,函数可以返回错误代码

;缺省状态,函数会死等。

 

如果任务死等,那么他就会进入消息队列的等待队列中,等待队列中排序方式可以是FIFO也可以是优先级排序。

 

14.3.4 : 发送消息

 

任务使用rtems_message_queue_send 和 rtems_message_queue_urgent 函数向消息队列发送消息。如果消息队列本来就是空的,

而等待那么两个函数效果相同。等待队列中第一个任务将会获取消息,变成就绪状态。

 

如果消息队列中有消息,rtems_message_queue_send 把消息放在消息队列的后面而 rtems_message_queue_urgent 把消息放在队

列的前面。 如果消息队列满了,两个函数都不能继续向队列中放消息。

 

14.3.5 : 消息广播

 

rtems_message_queue_broadcast函数将会向等待队列上的每个任务发送消息,该过程是以原子操作的方式进行的。消息内容将会

复制到每个等待任务的消息缓冲区,并且解除阻塞。函数返回了接收到广播的任务数目。

 

14.3.6 : 删除消息排队

 

rtems_message_queue_delete函数删除消息队列而且释放它的控制块以及内存资源。任何知道消息队列ID标识的本地任务都可以删

除队列。该函数执行后,所有消息队列上的等待任务都会变成就绪态,他们调用的消息获取函数都会返回对应的错误代码。此后对

消息ID的引用也会返回错误。



http://www.ppmy.cn/news/803570.html

相关文章

QQ接收消息

打开终端输入cd空格拖进新建的工程. 然后输入pod init ,打开新建工程的文件夹, 里面就会有Podfile 文件,打开将下面的粘贴里面,输入pod install下载完成关闭 pod ‘RongCloudIM/IMLib’, ‘~> 2.8.3’ pod ‘RongCloudIM/IMKit’, ‘~> 2.8.3’ 然后导入头文件在appdeleg…

qq消息发射器

保存为名字.vbs双击即可,会直接粘贴你剪切板的内容到你聚焦的窗口。   结束方式:在任务管理器里结束wscript   Set WshShell WScript.CreateObject("WScript.Shell")   WshShell.AppActivate ""   for i1 to 100   WScr…

Qmsg酱实现QQ消息自由推送

官网传送门Qmsg官网 登录Qmsg网站。 添加需要接收消息的QQ号。 调用接口(查看接口文档)发送GET或POST请求。 发送消息非常简单,只需要向您的接口地址发一个GET或者POST(推荐)请求即可。 参数:msg:消息内容qq&#…

Windows超级管理器

Windows超级管理器 Windows超级管理器是一款系统管理软件,该软件功能十分全面,提供了全面的系统检测,高效地帮助用户查看及了解计算机参数配置,并附带了多个实用的工具,有效地检测出电脑存在错误或无用的文件并清理&a…

腾讯QQ分享消息

腾讯QQ分享消息 准备工作实现QQ分享创建实例分享给好友实现回调 准备工作 下载SDK资源包和相关文档&#xff0c;把*.jar包放在libs目录下&#xff0c;并点击更新同步按钮Sync project 文档来源 配置Amanifest.xml文件&#xff0c;添加相关权限和回调活动 <uses-permission…

QQ是怎么处理消息的

QQ的工作原理&#xff1a; 1、登录&#xff0c;先在本地验证密码&#xff0c;如果与本地密码不一致&#xff0c;提示是否去服务器验证密码。不管本地还是服务器&#xff0c;验证密码通过后&#xff0c;就从服务器获取用户信息和系统消息&#xff08;包括离线消息&#xff09;&…

Windows超级管理器简介

Windows超级管理器 9.43 Compatible Windows超级管理器配置概览自启动项隐私清理磁盘保护文件粉碎文件扫描工具大全下载地址 Windows超级管理器 Windows超级管理器是一款Windows系统管理工具。它支持查看硬件信息&#xff0c;关闭开机自启项、磁盘保护、断网修复、一键关闭Def…

定时向QQ推送天气消息

文章目录 前言一、QQpusher介绍1&#xff0c;简介2&#xff0c;使用步骤 二、详细代码项目介绍主要代码部分介绍源代码 总结 前言 本文主要使用的是 1&#xff0c;QQpusherAPI接口推送服务 2&#xff0c;Python requests 模块 消息推送主要使用QQpusher的接口&#xff0c;非常…