0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ZWave中的消息队列机制是什么

汽车电子技术 来源:IOT物联网小镇 作者:Sewain 2023-02-14 13:41 次阅读

文章主题

在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁、高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的。这篇文章就来看看 ZWave 中是通过什么机制为我们提供了一个便捷的消息队列处理机制。



    内容导航
  • 消息队列是什么

  • 我自己写的消息队列

  • ZWave 消息队列的结构

  • ZWave 消息队列的使用(初始化、存储消息、取出消息)

    消息队列是什么
    

    消息队列最主要特点是:存储消息,先进先出。

    比如在典型的生产者-消费者编程模型中,先创建一个消息队列,最大容量是 100。

    当生产者产生一条消息时,如果消息队列未满,就放进消息队列的尾部。

    消费者定期去检查消息队列中是否有消息,如果有,则取出最前面的那条消息进行处理,直到把队列中的所有消息都处理完。

    当然,如果链表来创建一个动态的消息队列也是可以的,这样就可以构成一个无容量限制的队列,这个模型有点复杂,咱们暂且不讨论它。

图片

我自己写的消息队列  


在我自己的开发过程中,经常需要使用消息队列来保存多条消息,每一条消息都存储长度不等的字符串,于是就自己写了一个最简单的消息队列实现模板,当然对于项目来说也是最合适的,因为是量体裁衣嘛。

一共2个文件(.h, .c),每次项目中需要用到时,就把这2个文件拷贝过来,再简单修改一下(保存的每条消息满足应用的需求),就直接用上了。简单、粗暴、有效、好用,每次都能很块就解决我的问题。

这里简单截个图,如果需要,我可以免费分享!

图片

使用起来也比较简单,只需要3个步骤。

图片

ZWave 消息队列的结构  


ZWave SDK 的每一个 Sample 中已经给我们提供了一个很好的消息队列编程模型,不过它还嵌入了一个 task 任务管理的机制,后面我会简单画一下 task 的处理逻辑,但是不会深入探究。

先来看一下 ZWave 提供的消息队列的结构。

图片

请注意:这是消息队列的结构,而这个队列中存储的每一条消息是存储在一个数组缓冲区中,通过 array 指针进行引用。因此,在消息队列初始化的时候,必须提供一个数组,并把数组的地址赋值给 array 指针。

关于这个数组,从代码中可以看到 QElementType 其实就是一个无符号字节,因此,这个消息队列仅仅能存储最最简单的消息,即:一个字节的数值。可以看一下 SwitchOnOff.c 中所存储的消息,都是 EVENT_APP 这个枚举类型的值。


    ZWave 消息队列的使用

1.消息队列的初始化

在应用程序初始化的时候,ZWave 实例程序为我们已经创建好一个消息队列了,流程如下。

图片

可以看到,一共有 2 个消息队列:eventQueue 和 jobQueue,这两个队列的实现机制都是一样的,只不过是把不同类型的消息放在不同的队列而已,因此,只要分析其中一个 eventQueue 就可以了。

初始化完成之后,存储消息的数组是空的,消息队列的有效消息个数是 0。

2.存储消息到消息队列

就是把一条新消息放入消息队列的数组中,然后更新消息队列的一些状态参数,比如:有效消息长度,存储的这条消息位置等等。

函数调用流程如下。

图片

3.从消息队列中获取消息

这个也很好理解,就是通过消息队列的结构检查一下是否有消息等待处理。如果是的话,就取出消息,并更新消息队列的一些状态参数。

函数调用流程如下。

图片

ZWave 文档中已经说明,协议层会定期调用应用层的函数 ApplicationPoll( ) ,这也是 ZWave 推荐的方式让应用层执行自己的逻辑,但是应用层不能在这个函数中执行太长时间。

在这个函数中,我们可以直接去消息队列中取出一个消息。但是如果这么做的话,就浪费了 ZWave 为我们提供的 Task 机制,因此这里调用了 TaskApplicationPoll( ),然后我们应用层的事件处理函数 AppStateManager( ) 就老老实实的待着,等待别人把事件消息准备好、喂过来。

其实,这也是一种分层编程思想,如下。

图片

** 总结 **

现在再回头看一下 ZWave 的消息队列处理机制,思路非常清晰,而且扩充性非常强。

后面我希望自己可以抽一点时间,把这里的代码抽取出来,写一个通用的、能够处理一些复杂消息的消息队列机制,让开发过程变得更加愉悦!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机制
    +关注

    关注

    0

    文章

    24

    浏览量

    9720
  • Zwave
    +关注

    关注

    0

    文章

    8

    浏览量

    12091
  • 消息队列
    +关注

    关注

    0

    文章

    31

    浏览量

    2921
收藏 人收藏

    评论

    相关推荐

    FIFO队列原理简述

    FIFO是队列机制中最简单的,每个接口上只有一个FIFO队列,表面上看FIFO队列并没有提供什么QoS保证,甚至很多人认为FIFO严格意义上不算做一种
    发表于 07-10 09:22 1395次阅读

    ZWAVE技术贴

    公司近来发展zwave产品,zwave确实是很困难并且没有资料参考。请问各位大神谁知道zwave程序如何烧写用什么软件?
    发表于 09-19 19:29

    zwave 认证资料总结

    zwave 通讯 认证 相关的资料学习。
    发表于 12-01 17:29

    zwave 通讯 资料 zwave 学习资料 翻译好的一些zwave资料

    zwave通讯资料
    发表于 12-05 19:20

    Linux等待队列如何实现

    在软件开发任务经常由于某种条件没有得到满足而不得不进入睡眠状态,然后等待条件得到满足的时候再继续运行,进入运行状态。这种需求需要等待队列机制的支持。Linux中提供了等待队列
    发表于 08-05 07:47

    基于stm32串口环形缓冲队列处理机制是什么

    基于stm32串口环形缓冲队列处理机制是什么
    发表于 12-08 07:06

    怎样去设计一种采用覆盖机制的FIFO队列模型呢

    FIFO队列是什么?怎样去设计一种采用覆盖机制的FIFO队列模型呢?
    发表于 12-08 06:07

    一种高效的磁盘队列I/O机制

    分析了传统磁盘队列的存储管理开销和读写性能,针对磁盘队列I/O已成为影响消息服务器性能的首要瓶颈,提出了一种高效磁盘队列I/O机制—FlashQ。FlashQ采用物理上连续的磁盘块
    发表于 05-14 19:51 32次下载

    iFix组态软件中基于队列的命令处理机制研究

    提出了一种在iFix 组态软件中创建消息队列的方法,利用这种消息队列实现了对控制命令的执行情况的跟踪与处理。这种基于队列的命令处理机制确保了组态软件的控制命令能够
    发表于 12-23 14:06 22次下载

    基于Linux 软中断机制以及tasklet、工作队列机制分析

    软中断分析最近工作繁忙,没有时间总结内核相关的一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些tasklet、工作队列机制
    的头像 发表于 01-15 12:55 3668次阅读
    基于Linux 软中断<b class='flag-5'>机制</b>以及tasklet、工作<b class='flag-5'>队列</b><b class='flag-5'>机制</b>分析

    一文知道zwave和zigBee的区别

    zwave是一种无线通信技术,允许任何节点直接或间接与通信范围内的其他邻近节点进行通信,具有低成本、低功耗和高可靠性的特征。
    发表于 09-25 15:44 9921次阅读

    基于多级队列的云服务并发量分级缓存机制

    基于多级队列的云服务并发量分级缓存机制
    发表于 06-24 11:35 15次下载

    单片机消息队列的实现原理和机制

    单片机开发过程中通常会用到“消息队列”,一般实现的方法有多种。 本文给大家分享一下队列实现的原理和机制
    的头像 发表于 05-26 09:50 884次阅读
    单片机消息<b class='flag-5'>队列</b>的实现原理和<b class='flag-5'>机制</b>

    RTOS消息队列的应用

    基于RTOS的应用中,通常使用队列机制实现任务间的数据交互,一个应用程序可以有任意数量的消息队列,每个消息队列都有自己的用途。
    发表于 05-29 10:49 427次阅读
    RTOS消息<b class='flag-5'>队列</b>的应用

    zwave与zigbee的区别

    zwave是一种无线通信技术,允许任何节点直接或间接与通信范围内的其他邻近节点进行通信,具有低成本、低功耗和高可靠性的特征。
    的头像 发表于 12-11 16:35 404次阅读