uc/os-2中消息队列使用了哪些数据结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uc/os-2中消息队列使用了哪些数据结构相关的知识,希望对你有一定的参考价值。

参考技术A 实验步骤如下:
1:在q_example.c中编写消息队列的任务函数QTaskA、QTaskB、QTaskC ,以及定义消息队列实体void* QMessageStorage[QSIZE];等
2:修改配置头文件中os_cfg.h的与消息队列相关的宏定义
3:在app.c文件main函数中,将创建对应的任务,并且启动系统,开启时钟调度等。

μC/OS-II 任务的同步与通信 --- 消息队列

简介

使用消息队列可以在任务之间传递多条消息。消息队列由三个部分组成:事件控制块、消息队列和消息。
当把事件控制块成员 OSEventType 的值置为 OS_EVENT_TYPE_Q 时,该事件控制块描述的就是一个消息队列。
消息队列相当于一个共用一个任务等待列表的消息邮箱数组,事件控制块成员 OSEventPtr 指向了一个叫做队列控制块(OS_Q)的结构,该结构管理了一个数组 MsgTbl[ ],该数组中的元素都是一些指向消息的指针。

消息队列的数据结构

其中,可以移动的指针为 OSQIn 和 OSQOut,而指针 OSQStart 和 OSQEnd 只是一个标志(常指针)。当可移动的指针 OSQIn 或 OSQOut 移动到数组末尾,也就是与 OSQEnd 相等时,可移动的指针将会被调整到数组的起始位置 OSQStart。也就是说,从效果上来看,指针 OSQEnd 与 OSQStart 等值。于是,这个由消息指针构成的数组就头尾衔接起来形成了一个如下图所示的循环的队列。

为了对图所示的消息指针数组进行有效的管理,μC/OS-II 把消息指针数组的基本参数都记录在一个叫做队列控制块的结构中,队列控制块的结构如下:

typedef struct os_q 
{
    struct os_q *OSQPtr; 
    void **OSQStart;
    void **OSQEnd;
    void **OSQIn;
    void **OSQOut;
    INT16U  OSQSize;
    INT16U  OSQEntries;
} OS_Q;

消息队列的创建

创建一个消息队列首先需要定义一指针数组,然后把各个消息数据缓冲区的首地址存入这个数组中,然后再调用函数 OSQCreate( ) 来创建消息队列。创建消息队列函数 OSQCreate( ) 的原型为:

OS_EVENT OSQCreate(
void **start, //指针数组的地址
INT16U size //数组长度
); 

请求消息队列

请求消息队列的目的是为了从消息队列中获取消息。任务请求消息队列需要调用函数 OSQPend( ),该函数的原型为:

void *OSQPend(
OS_EVENT *pevent,	//所请求的消息队列的指针
INT16U timeout,		//等待时限
INT8U *err			//错误信息
);

向消息队列发送消息

任务需要通过调用函数 OSQPost( ) 或 OSQPostFront( ) 来向消息队列发送消息。函数 OSQPost( ) 以 FIFO(先进先出)的方式组织消息队列,函数 OSQPostFront( ) 以 LIFO(后进先出)的方式组织消息队列。这两个函数的原型分别为:

INT8U OSQPost(
OS_EVENT *pevent,	//消息队列的指针
void *msg			//消息指针
);

INT8U OSQPostFront(
OS_EVENT *pevent, 	//消息队列的指针
void *msg			//消息指针
);

函数中的参数 msg 为待发消息的指针。

参考自:《μC/OS-II 入门教程》

以上是关于uc/os-2中消息队列使用了哪些数据结构的主要内容,如果未能解决你的问题,请参考以下文章

基于ucos的实时温度检测

消息队列

iCore3 双核心板_ uC/OS-III例程十一:任务消息队列

16.4-uC/OS-III同步 (任务信号量)

消息队列哪些常见的面试题

MQ消息队列常见面试题