文章主題
在我們的日常編程中,對消息隊列的需求非常常見,使用一個簡潔、高效的消息隊列編程模型,對于代碼邏輯的清晰性,對于事件處理的高效率來說,是非常重要的。這篇文章就來看看 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瀏覽量
9829 -
Zwave
+關注
關注
0文章
8瀏覽量
12139 -
消息隊列
+關注
關注
0文章
33瀏覽量
3017
發布評論請先 登錄
相關推薦
FIFO隊列原理簡述
FIFO是隊列機制中最簡單的,每個接口上只有一個FIFO隊列,表面上看FIFO隊列并沒有提供什么QoS保證,甚至很多人認為FIFO嚴格意義上不算做一種
發表于 07-10 09:22
?1707次閱讀
Linux等待隊列如何實現
在軟件開發中任務經常由于某種條件沒有得到滿足而不得不進入睡眠狀態,然后等待條件得到滿足的時候再繼續運行,進入運行狀態。這種需求需要等待隊列機制的支持。Linux中提供了等待隊列的
發表于 08-05 07:47
一種高效的磁盤隊列I/O機制
分析了傳統磁盤隊列的存儲管理開銷和讀寫性能,針對磁盤隊列I/O已成為影響消息服務器性能的首要瓶頸,提出了一種高效磁盤隊列I/O機制—FlashQ。FlashQ采用物理上連續的磁盤塊
發表于 05-14 19:51
?32次下載
iFix組態軟件中基于隊列的命令處理機制研究
提出了一種在iFix 組態軟件中創建消息隊列的方法,利用這種消息隊列實現了對控制命令的執行情況的跟蹤與處理。這種基于隊列的命令處理機制確保了
發表于 12-23 14:06
?22次下載
SystemVerilog中的隊列
隊列是大小可變的有序集合,隊列中元素必須是同一個類型的。隊列支持對其所有元素的訪問以及在隊列的開始或結束處插入和刪除。
FreeRTOS消息隊列介紹
隊列是為了任務與任務、任務與中斷之間的通信而準備的,可以在任務與任務、任務與中斷之間傳遞消息,隊列中可以存儲有限的、大小固定的數據項目。任務與任務、任務與中斷之間要交流的數據保存在隊列
zwave與zigbee的區別
zwave是一種無線通信技術,允許任何節點直接或間接與通信范圍內的其他鄰近節點進行通信,具有低成本、低功耗和高可靠性的特征。
評論