ucosiii消息队列(代码片段)

想成为大师啊 想成为大师啊     2022-12-13     524

关键词:

1、UCOSIII任务间通信

1.1、任务间通信:

一个任务或者中断服务程序有时候需要和另一个任务交流信息 ,这个就是消息传递的过程就叫做任务间通信,任务间的消息传递可以通过2种途径:一是全局变量,二是通过发布消息

使用全局变量的时候每个任务或者中断服务程序都必须保证其对全局变量的独占访问。消息也可以通过消息队列作为中介发布任务。


什么是消息?

消息包含以下几个部分:指向数据的指针数据的长度记录消息发布的时间戳,指针指向的可以是一块数据区域或者甚至是一个函数。消息的内容必须一直保持可见性,可见性是指代表消息的变量必须在接收消息的任务代码范围内有效。这是因为发布的数据采用的是指针传递,也就是引用传递,并不是值传递。也就是说,发布的消息本身并不产生拷贝,我们可以使用动态内存分配的方式来给消息分配一个内存块,或者,也可以传递一个指向全局变量、全局数据结构、全局数组或者函数的指针。

struct  os_msg                                             /* MESSAGE CONTROL BLOCK                                  */
    OS_MSG              *NextPtr;                           /* Pointer to next message                                */
    void                *MsgPtr;                            /* Actual message                                         */
    OS_MSG_SIZE          MsgSize;                           /* Size of the message (in # bytes)                       */
    CPU_TS               MsgTS;                             /* Time stamp of when message was sent                    */
;


2、UCOSIII消息队列

消息队列是UCOSIII中的一个内核对象,为结构体OS_Q

struct  os_q                                               /* Message Queue                                          */
                                                            /* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_Q                         */
    CPU_CHAR            *NamePtr;                           /* Pointer to Message Queue Name (NUL terminated ASCII)   */
    OS_PEND_LIST         PendList;                          /* List of tasks waiting on message queue                 */
#if OS_CFG_DBG_EN > 0u
    OS_Q                *DbgPrevPtr;
    OS_Q                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
                                                            /* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_MSG_Q             MsgQ;                              /* 消息队列                                       */
;

2.1、消息队列API函数

函数名作用
OSQCreate()创建一个消息队列
OSQDel()删除一个消息队列
OSQFlush清空消息队列
OSQPend()等待消息
OSQPendAbort()取消等待消息
OSQPost()向消息队列发布一则消息

创建一个消息队列

void  OSQCreate (OS_Q        *p_q,	// 定义一个消息队列
                 CPU_CHAR    *p_name,	// 命名
                 OS_MSG_QTY   max_qty,	// 定义消息队列的大小
                 OS_ERR      *p_err)	// 定义错误码

等待消息

void  *OSQPend (OS_Q         *p_q,	// 定义一个消息队列
                OS_TICK       timeout,	// 设置超时时间
                OS_OPT        opt,	// 设置选项(OS_OPT_PEND_BLOCKING                        OS_OPT_PEND_NON_BLOCKING)
                OS_MSG_SIZE  *p_msg_size,	// 消息的大小
                CPU_TS       *p_ts,
                OS_ERR       *p_err)

向消息队列发布一则消息

void  OSQPost (OS_Q         *p_q,	// 定义一个消息队列
               void         *p_void,	// 值传递、引用传递
               OS_MSG_SIZE   msg_size,	// 发送消息的大小(字节数)
               OS_OPT        opt,	// 选项(OS_OPT_POST_ALL
               						// OS_OPT_POST_FIFO
               						// OS_OPT_POST_LIFO
               						// OS_OPT_POST_NO_SCHED)
               OS_ERR       *p_err)

3、UCOSIII任务内建消息队列

同任务内嵌信号量一样,UCOSIII的每个任务中也有内建消息队列。而且多个任务等待同一个消息队列的应用很少见,UCOSIII中每个任务多有其内建消息队列的话用户可以不用通过外部的消息队列而直接向任务发布消息

如果需要使用任务内建消息队列功能的时候需要将宏 OS_CFG_TASK_Q_EN置1来使能相关的代码

函数名作用
OSTaskQPend()等待消息
OSTaskQPendAbort()取消等待消息
OSTaskQPost()向任务发布一则消息
OSTaskQFlush()清空任务的消息队列
#define TASK_Q_NUM	4		//发任务内建消息队列的长度

消息队列(代码片段)

前提:基于Linux系统的学习消息队列1获取键值 ftok(3)2获取消息队列的id   msgget(2)3向消息队列发送消息  msgsnd(2)4从消息队列获取消息  msgrcv(2)//向消息队列中添加消息#include<stdio.h>#include<sys/types.h... 查看详情

ipc-消息队列(messagequeue)-使用(代码片段)

...IPC标识IPC键值IPC对象的访问IPC对象的权限和所有者结构体消息队列消息特性消息队列属性结构体打开或创建消息队列控制消息队列发送消息队列接收消息队列发送消息队列实例代码运行接收消息队列实例代码运行参考资料XSIIPCXSI... 查看详情

ipc-消息队列(messagequeue)-使用(代码片段)

...IPC标识IPC键值IPC对象的访问IPC对象的权限和所有者结构体消息队列消息特性消息队列属性结构体打开或创建消息队列控制消息队列发送消息队列接收消息队列发送消息队列实例代码运行接收消息队列实例代码运行参考资料XSIIPCXSI... 查看详情

消息队列(代码片段)

消息队列MQ维基百科中是这样介绍消息队列的消息队列(Messagequeue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中... 查看详情

text消息队列(代码片段)

查看详情

什么是消息队列啊?(代码片段)

大家好,我是walking,今天我们来聊一聊什么是消息队列,为什么要用消息队列,有什么好处呢?同样使用消息队列有什么坏处?我们的项目要引入消息队列了,之前只是听说使用消息队列有什么什么好处,感觉挺高大上的,自... 查看详情

mq消息队列(代码片段)

mq1、什么是消息队列1.1MQ基本框架1.2消息队列的优点1.3消息队列的缺点1.4消息队列比对2、RabbitMQ2.1、RabbitMQ如何保证消息不被重复消费2.2、RabbitMQ如何保证消息不丢失2.2.1生产者丢数据2.2.2消息队列丢数据2.2.3消费者丢数据2.3、Rabbit... 查看详情

systemvipc之消息队列(代码片段)

消息队列和共享内存、信号量一样,同属SystemVIPC通信机制。消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问。使用消息队列的好处是对每个消息指定了特定消息类型,接收消息的进程可以... 查看详情

分布式之消息队列复习精讲(代码片段)

本文大概围绕如下几点进行阐述:为什么使用消息队列?使用消息队列有什么缺点?消息队列如何选型?如何保证消息队列是高可用的?如何保证消息不被重复消费?如何保证消费的可靠性传输?如何保证消息的顺序性?我们围绕以上... 查看详情

基于stream的redis消息队列(代码片段)

目录一、消息队列二、基于List结构模拟消息队列基于List的消息队列的优点:基于List的消息队列的缺点:三、基于PubSub的消息队列基于PubSub的消息队列的优点:基于PubSub的消息队列的缺点:四、基于Stream的消息队... 查看详情

rabbitmq消息队列笔记(代码片段)

...(direct)测试 主题(topic)测试死信队列消息TTL过期测试队列达到最大长度测试消息被拒绝测试延迟队列延迟队列测试延迟队列优化 插件实现延迟队列安装插件测试插件交换机RabbitMQ消息传递模型的核心思想是&#... 查看详情

rabbitmq消息队列笔记(代码片段)

...(direct)测试 主题(topic)测试死信队列消息TTL过期测试队列达到最大长度测试消息被拒绝测试延迟队列延迟队列测试延迟队列优化 插件实现延迟队列安装插件测试插件交换机RabbitMQ消息传递模型的核心思想是&#... 查看详情

消息队列rabbitmq(代码片段)

消息队列RabbitMQ 消息队列消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。  消息队列(MessageQueue)是一种应用间的通信方式,消息发送后可以立即... 查看详情

rt_thread的消息队列(代码片段)

目录前言一、概念 二、实例1、消息队列控制块2、消息队列创建函数2.1、创建消息队列3、消息队列的删除函数3.1、删除消息队列4、发送消息列表函数4.1、发送消息线程4.2、创建发送消息线程五、接收消息5.1、接受消息函数5.2、... 查看详情

rt_thread的消息队列(代码片段)

目录前言一、概念 二、实例1、消息队列控制块2、消息队列创建函数2.1、创建消息队列3、消息队列的删除函数3.1、删除消息队列4、发送消息列表函数4.1、发送消息线程4.2、创建发送消息线程五、接收消息5.1、接受消息函数5.2、... 查看详情

posix消息队列(代码片段)

消息队列是LinuxIPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。消息队列和管道和FIFO区别    1.一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达  管道... 查看详情

场景应用:redis如何做消息队列?(代码片段)

文章目录Redis做消息队列消息保序处理重复的消息证消息可靠性总结Redis做消息队列因为Redis中的list是双向链表也可以当队列的特性消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息和保证... 查看详情

rpc和消息队列(代码片段)

目录RPC和消息队列1消息队列2Rabbitmq2.1安装2.2基本使用2.3消息确认机制2.4持久化2.5闲置消费2.6发布订阅2.7关键字2.8模糊匹配2.9rabbitmq实现rpc3python中的rpc框架3.1SimpleXMLRPCServer3.2ZeroRPC实现rpcRPC和消息队列1消息队列1两个服务调用:restf... 查看详情