JN5169 zigbee3.0协议栈----消息队列

消息队列

节点上的应用程序任务之间的通信是通过消息队列实现的。应用程序可以为特定的通信通道创建专用的消息队列
在zigbee协议栈中关于队列相关相关函数如下和队列加入消息和读取消息流程图

PUBLIC void ZQ_vQueueCreate (tszQueue *psQueueHandle, const uint32 uiQueueLength, const uint32 uiItemSize, uint8* pu8StartQueue);
PUBLIC bool_t ZQ_bQueueSend(void *pvQueueHandle, const void *pvItemToQueue);
PUBLIC bool_t ZQ_bQueueReceive(void *pvQueueHandle, void *pvItemFromQueue);
PUBLIC bool_t ZQ_bQueueIsEmpty(void *pvQueueHandle);
PUBLIC uint32 ZQ_u32QueueGetQueueSize(void *pvQueueHandle);
PUBLIC uint32 ZQ_u32QueueGetQueueMessageWaiting ( void*    pu8QueueHandle );

在这里插入图片描述

  1. 队列管理的结构体
typedef struct
{
   uint32 u32Length;                    /*队列的成员个数,而不是字节数 */
   uint32 u32ItemSize;                /*< The size of each items that the queue will hold. */
   uint32 u32MessageWaiting;
   void  *pvHead;                        /*头节点 指针*/
   void  *pvWriteTo;                    /*指向存储区中空闲的下一个位置 */
   void  *pvReadFrom;                /*指向存储区中空闲的下一个位置 */
}tszQueue;
  1. 队列创建,必须指定队列的大小和队列中消息的大小,以及队列在内存中的起始位置
    ZQ_vZQueueCreate()
PUBLIC void ZQ_vQueueCreate ( tszQueue*       psQueueHandle, 
                             const uint32    u32QueueLength, 
                             const uint32    u32ItemSize, 
                             uint8*          pu8StartQueue )
{
       psQueueHandle->pvHead =  pu8StartQueue;
       psQueueHandle->u32ItemSize =  u32ItemSize;
       psQueueHandle->u32Length =  u32QueueLength;
       psQueueHandle->pvWriteTo =  psQueueHandle->pvHead;
       psQueueHandle->u32MessageWaiting =  0;
       psQueueHandle->pvReadFrom =  psQueueHandle->pvHead;
}

参数:psQueueHandle 指向自己定义tszQueue类型消息队列
u32QueueLength 是根据队列可以容纳的消息数量确定队列的大小
u32ItemSize 队列中消息的大小,以字节为单位
pu8StartQueue 指向消息队列开始的指针

我们一般会在工程初始化时,系统需要创建必须队列
示例如下:

    ZQ_vQueueCreate(&zps_msgMlmeDcfmInd,         MLME_QUEQUE_SIZE,      sizeof(MAC_tsMlmeVsDcfmInd), (uint8*)asMacMlmeVsDcfmInd);
    ZQ_vQueueCreate(&zps_msgMcpsDcfmInd,         MCPS_QUEUE_SIZE,       sizeof(MAC_tsMcpsVsDcfmInd), (uint8*)asMacMcpsDcfmInd);
    ZQ_vQueueCreate(&zps_TimeEvents,             TIMER_QUEUE_SIZE,      sizeof(zps_tsTimeEvent),     (uint8*)asTimeEvent);
    ZQ_vQueueCreate(&zps_msgMcpsDcfm,            MCPS_DCFM_QUEUE_SIZE,  sizeof(MAC_tsMcpsVsCfmData),(uint8*)asMacMcpsDcfm);

3.ZQ_bQueueSend 添加指定队列添加成员数据

PUBLIC bool_t ZQ_bQueueSend ( void*          pvQueueHandle, 
                              const void*    pvItemToQueue )
{

    uint32 u32Store;
    tszQueue *psQueueHandle = (tszQueue *)pvQueueHandle;
    bool bReturn = FALSE;
    MICRO_DISABLE_AND_SAVE_INTERRUPTS(u32Store);
    if(psQueueHandle->u32MessageWaiting >= psQueueHandle->u32Length)
    {
        DBG_vPrintf(TRACE_ZQUEUE, "ZQ: Queue overflow: Handle=%08x\n", (uint32)pvQueueHandle);
    }
    else
    {        
        if( psQueueHandle->pvWriteTo >= (psQueueHandle->pvHead+(psQueueHandle->u32Length*psQueueHandle->u32ItemSize)))
        {
             psQueueHandle->pvWriteTo = psQueueHandle->pvHead;
        }
        ( void ) memcpy( psQueueHandle->pvWriteTo, pvItemToQueue, psQueueHandle->u32ItemSize );
        psQueueHandle->u32MessageWaiting++;
        psQueueHandle->pvWriteTo += psQueueHandle->u32ItemSize;
        
        /* Increase power manager activity count */
        PWRM_eStartActivity();        
        bReturn = TRUE;
    }
    MICRO_RESTORE_INTERRUPTS(u32Store);
    return bReturn;
}

参数:pvQueueHandle指向自己定义tszQueue类型的队列
pvItemToQueue 指向要添加到队列中的消息的指针
返回值:TRUE -消息成功添加到队列
FALSE-消息没有添加到队列

  1. ZQ_bQueueReceive此函数从指定的消息队列获取一条消息。返回代码指示是否成功地从队列获取了一条消息。
PUBLIC bool_t ZQ_bQueueReceive ( void*    pvQueueHandle, 
                                 void*    pvItemFromQueue )
{
    uint32 u32Store;
    tszQueue *psQueueHandle = (tszQueue *)pvQueueHandle;
    bool bReturn = FALSE;
    MICRO_DISABLE_AND_SAVE_INTERRUPTS(u32Store);
    if( psQueueHandle->u32MessageWaiting >  0)
    {
        if( psQueueHandle->pvReadFrom >= (psQueueHandle->pvHead+(psQueueHandle->u32Length*psQueueHandle->u32ItemSize) ))
        {
            psQueueHandle->pvReadFrom = psQueueHandle->pvHead;
        }
        ( void ) memcpy( pvItemFromQueue, psQueueHandle->pvReadFrom, psQueueHandle->u32ItemSize );
        psQueueHandle->pvReadFrom += psQueueHandle->u32ItemSize;
        psQueueHandle->u32MessageWaiting--;
        
        /* Decrease power manager activity count */
        PWRM_eFinishActivity();
        bReturn = TRUE;        
    }
    else
    {
        bReturn =  FALSE;
    }
    MICRO_RESTORE_INTERRUPTS(u32Store);
    return bReturn;
}

参数:pvQueueHandle指向自己定义tszQueue类型消息队列
pvItemFromQueue 指向内存位置的指针,用于接收获得的消息
返回值:TRUE -消息成功从队列获取
FALSE-消息没有成功从队列获取

注意事项:要允许JN516x/7x设备进入休眠模式,消息队列必须不包含任何消息。必须首先清空所有消息队列

声明:水平有限可能存在错误,请大家指导指出,谢谢

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只很笨很懒的肥猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值