Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1148507
  • 博文数量: 241
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 2279
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-27 19:53
个人简介

JustForFun

文章分类

全部博文(241)

文章存档

2023年(8)

2022年(2)

2021年(3)

2020年(30)

2019年(11)

2018年(27)

2017年(54)

2016年(83)

2015年(23)

我的朋友

分类: 嵌入式

2015-07-21 22:12:22

1.2、 uCOS-II消息队列
           与邮箱不同,当事件控制块OS_EVENT被用于消息队列时,域OSEventPtr指向一个循环队列的队列控制块(OS_Q)而不是指向一个消息。循环队列由队列控制块(OS_Q)进行维护,该数据结构详细信息如下:

  1. struct os_q {  
  2.      struct os_q   *OSQPtr;  
  3.      void         **OSQStart;   //指向消息队列的指针数组的起始地址的指针    
  4.      void         **OSQEnd;   //指向消息队列结束单元的下一个地址的指针      
  5.      void         **OSQIn;     //指向消息队列中插入下一条消息的位置的指针      
  6.      void         **OSQOut;    //指向消息队列中下一个取出消息位置的指针       
  7.     INT16U      OSQSize;     //消息队列中总的单元数            
  8.     INT16U      OSQEntries;   //消息队列中当前的消息数量   
  9. } OS_Q;  
struct os_q { struct os_q *OSQPtr; void **OSQStart; //指向消息队列的指针数组的起始地址的指针 void **OSQEnd; //指向消息队列结束单元的下一个地址的指针 void **OSQIn; //指向消息队列中插入下一条消息的位置的指针 void **OSQOut; //指向消息队列中下一个取出消息位置的指针 INT16U OSQSize; //消息队列中总的单元数 INT16U OSQEntries; //消息队列中当前的消息数量} OS_Q;


uCOS-II 提供了7 个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函数。在这里只对OSQCreate()、OSQFlush()和OSQPostFront()进行说明。

OS_EVENT *OSQCreate (void **start, INT16U size)
          创建一个消息队列,第一个参数是一个二重指针,该指针指向容纳各个消息的指针的指针数组的起始地址。在创建消息队列之前,首先需要定义一个指针数组,该数组的元素个数必须和消息队列最大消息数相等。然后把这个数组的起始地址传给OSQCreate。这里需要注意的是该数组必须是void类型。第二个参数是消息队列最大消息数,即指针数组的大小。

INT8U OSQFlush (OS_EVENT *pevent)
          清空消息队列中所有的消息,重新开始使用。函数参数是指向需要清空消息队列的指针。

INT8U OSQPostFront (OS_EVENT *pevent, void *msg)
          OSQPostFront()函数和OSQPost()基本上是一样的,只是在插入新的消息到消息队列中时,使用OSQOut 作为指向下一个插入消息的单元的指针,而不是OSQIn。由于OSQPend()取出的消息是OSQPostFront()刚刚插入的,因此OSQPostFront()函数实现了一个LIFO队列。

阅读(1248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~