uc/os-II 分析(10)--消息队列

来源:互联网 发布:调音软件哪个好 编辑:程序博客网 时间:2024/05/16 01:41

消息队列在任务间可以传递多条消息,由3部分组成:事件控制块、消息队列和消息、

OSEventType=OS_EVENT_TYPE_Q时,描述的就是消息队列。

1.消息指针数组

消息队列的核心iushi消息指针数组。

OSQSize: 数组的长度;

OSQEnter:已存放消息指针的元素数目;

OSQStart: 指针,指向消息指针的起始数组;

OSQEnd:指针,指向消息指针数组结束单元的下一个单元,它使得数组构成了一个循环的缓冲区;

OSQIn:指针,指向插入下一条消息的位置,当它移动到OSQEnd相等时,是调整到指向数组的起始单元;

OSQOut:指针,指向被取出消息的位置,当它移动到与OSQEnd相等时,被调整到指向数组的起始单元

 2种插入数据方式:

   先进先出: OSQIn:插入, OSQOut:输出;

  后进先出: OSQOut;


2. 队列控制块


消息指针数组的管理: 消息指针数组的基本参数都记录在一个教队列控制块的结构中;

typedef   struct os_q

{

      struct os_q   *OSQPtr;

       void   ** OSQStart;

      void  ** OSQEnd;

       void  ** OSQIn;

       void **  OSQOut;

      INT16U   OSQSize;

      INT16U   OSQEntries;

}OS_Q;



3. 创建消息队列

   OS_EVENT   OSQCreate(

void  *  *start,      //指针数组的地址

   INT16U   size     // 数组长度

);


4. 请求消息队列

   为了从消息队列中获取消息。函数原型:

  void * OSQPend( OS_EVENT  *pevent,

INT16U  timeout,

INT8U   *err);

返回值: 消息指针;


希望任务无等待地请求一个消息队列,则需要调用OSQAccept(),函数原型:

void    OSQAccept(  OS_EVENT  *pevent);


5. 向消息队列发送消息

   OSQPost():先进先出;  OSQPostFront():后进先出‘

INT8U   OSQPost(OS_EVENT   *pevnet,   void *msg);

INT8U  OSQPostFront(  OS_EVENT  *pevent,   void *msg)


任务希望以广播的方式通过消息队列发送消息:函数原型:

INT8U   OSQPostOpt(OS_EVENT   *pevent,   void *msg,  INT8U   opt);


6.清空消息队列

  INT8U    OSQFlush(  OS_EVENT  *pevent);


7. 删除消息队列

  OS_EVENT  *OSQDel( OS_EVENT  *pevent);


8.  查询消息队列

INT8U   OSQQuery(OS_EVENT  *pevent,  OS_Q_DATA  *pdata);

 pdata:c存放状态信息的结构;

typedef   struct {

void *OSMsg;

INT16U  OSNMsgs;

  INT16U   OSQSize;

INT8U     OSEventTbl[OS_EVENT_TBL_SIZE];

INT8U     OSEventGrp;

}OS_Q_DATA;


0 0
原创粉丝点击