UCOSIII消息队列

Posted 想成为大师啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UCOSIII消息队列相关的知识,希望对你有一定的参考价值。

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		//发任务内建消息队列的长度

以上是关于UCOSIII消息队列的主要内容,如果未能解决你的问题,请参考以下文章

UCOSIII消息队列

UCOSIII中的节拍列表更新

IPC System V 消息队列 - 发送一个数组块

嵌入式:UCOSIII的使用

rabbitmq - 不会获取队列中的所有消息

Android UI 线程消息队列调度顺序