OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3098|回复: 0

分享一下ucosiii消息队列的分析

[复制链接]

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-2-15 12:27:40 | 显示全部楼层 |阅读模式
一起来看看

消息的结构体定义
    OS_Q
                struct  os_q {                                              /* Message Queue   消息队列                                       */
                                                            /* ------------------通用成员 ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_Q   需要使能  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;                              /*  消息成员                                       */
};
消息队列相当于一个邮箱   而一个邮箱中的邮件的个数是不确定的,以上包括了对于消息队列的描述及等待列表

其中一个邮件
MsgQ的结构体定义

struct  os_msg_q {                                          /* OS_MSG_Q                                               */
    OS_MSG              *InPtr;                             /* Pointer to next OS_MSG to be inserted  in   the queue     队列的进入指针 (这个是我自己的翻译) */
    OS_MSG              *OutPtr;                            /* Pointer to next OS_MSG to be extracted from the queue    队列的退出指针   */
    OS_MSG_QTY           NbrEntriesSize;                    /* Maximum allowable number of entries in the queue    队列的最大值   */
    OS_MSG_QTY           NbrEntries;                        /* Current number of entries in the queue   当前队列中的条目数               */
    OS_MSG_QTY           NbrEntriesMax;                     /* Peak number of entries in the queue   队列中条目的峰值数目                 */
};

队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。



该邮件的具体信息保存在指针指向的地方
OS_MSG   结构体定义

              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         消息发送的时间戳           */
};
因此以上用了三组结构体嵌套来描述一个消息队列。
其中OS_MSG里的NextPtr指针应该和os_msg_q 的OutPtr指针应该是指向一个地方。
不知道我说的对不对?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表