CC2530 ZigBee協議棧 學習心得

斌cazure發表於2018-09-15

最近一直在學習研究cc2530這款微控制器,感覺自己的C語言水平還是不夠有得提升的空間,但還是有不少收穫。
   CC2530是一款支援ZigBee無線組網協議的低功耗微控制器,cc2530主要的應用場景是在物聯網方面。因為有著無線組網和低功耗的優勢所以被廣泛使用物聯網無線資料採集和控制。
   ZigBee協議棧,一聽就應該明白,這是個像TCP/IP一樣的複雜協議,其實不然微控制器的RAM和ROM都是有限的,而且cc2530還有無線收發能力所以系統的資源很緊缺,經過我的鑽研ZigBee協議的程式碼發現並不複雜,感覺自己的C語言又進步了,理解了一些C語言的精髓。

 

    我學習Texas Instruments公司ZStack-CC2530-2.5.0協議棧,這是個半開源的協議棧,有些核心程式碼是以庫的形式提供的,所以協議棧是以軟體形式安裝在電腦上,安裝後在C盤會有工程原始碼,開發的基本思路是藉助IT提供的工程模板自己修改SampleApp的工程就行了。其實Zigbee協議棧規範和Z-Stack的關係也差不多,Z-Stack就是符合Zigbee協議棧規範的一個硬體和軟體平臺,是Zigbee協議棧的一個具體實現。Z-Stack的整個開發環境IDE使用的是IAR(IAR的版本需要參考Z-Stack Home Sample Application User's Guide。此文件在TI提供的資料包裡\Documents內)。想詳細瞭解IAR或者使用過程中遇到什麼問題請使用IAR的help選項。

    Z-Stack是分層設計的,主要分為物理層(PHY和MAC)、介質訪問層(MAC)、網路層(NWK)、應用層(APS和ZDO、APL),還有一個OSAL作業系統抽象層。

    Z-Stack採用事件輪詢式的作業系統,OSAL就是以實現多工為核心的系統資源管理機制,說起來很叼,多工管理。但是看到程式碼就會恍然大悟,實現原理很簡單,從IAR工程裡ZMian資料夾下面的ZMian.c檔案中找到main()函式,然後跟隨協議棧的初始化定義,最後會走到osal_start_system();裡面有實現輪序程式碼,根據tasksEvents[]陣列從低位到高位的優先順序執行tasksArr[]陣列的事件處理函式,並且還有訊息佇列用來接收無線的資料收發


Z-Stack採用基於一個輪轉查詢式作業系統,該作業系統命名為OSAL(Operating System Abstraction Layer),中文為“作業系統抽象層”。Z-Stack協議棧將底層、網路層等複雜部分遮蔽掉,讓程式設計師通過API函式就可以輕鬆地開發一套ZigBee系統。

作業系統(Operating System,簡稱OS)看似很複雜,其實只要做幾個實訓專案,就會很快撐握整個OSAL的工作原理,首先了解一下幾個關鍵的作業系統術語。

1. 資源(Resource)

任務所佔用的實體都可以稱為資源,如一個變數、陣列、結構體等。

2. 共享資源(Shared Resource)

至少可以被兩個任務使用的資源稱為共享資源,為了防止共享資源被破壞,每個任務在操作共享資源時,必須保證是獨佔該資源。

3. 任務(Task)

任務又稱執行緒,是一個簡單程式的執行過程。在任務設計時,需要將問題儘可能地分為多個任務,每個任務獨立完成某種功能,同時被賦予一定的優先順序,擁有自己的CPU暫存器和堆疊空間。一般將任務設計為一個無限迴圈。

4. 多工執行(Muti-task Running)

CPU採用任務排程的方法執行多個任務,例如:有10個任務需要執行,每隔10ms執行一個任務,由於每個任務執行的時間很短,任務切換很頻繁,這就造成了多工同時執行的“假象”。實際上,一個時間點只有一個任務在執行。

5. 核心(Kernel)

在多工系統中,核心負責為每個任務分配CPU時間、切換任務、任務間的通訊等。核心可以大大簡化應用系統的程式設計,可以將應用程式分為若干個任務,通過任務切換來實現程式執行。

6. 互斥(Mutual Exclusion)

多工間通訊的最簡單方法是使用共享資料結構,對於微控制器系統來說,所有任務共用同一地址的資料,具體表現為全域性變數、指標、緩衝區等資料結構。雖然共享資料結構的方法簡單,但是必須保證對共享資料結構的寫操作具有唯一性。

保護共享資源最常用的方法是:關中斷、使用測試並置位指令(T&S指令)、禁止任務切換和使用訊號量。其中,在ZigBee協議棧作業系統中,經常使用的方法是關中斷。

7. 訊息佇列(Message Queue)

訊息是收到的事件和資料的封裝,比如發生了一個事件(收到別的節點發來的訊息),這時就會把這個事件所對應的事件號及收到的資料封裝成訊息,放入訊息佇列中。

8. 事件(Events)

ZigBee協議棧是由各個層組成的,每一層都要處理各種事件,所以就為每一層定義了一個事件處理函式,可以把這個處理函式理解為任務,任務從訊息佇列中提取訊息,從訊息中提取所發生的具體事件,呼叫相應的具體事件處理函式,比如按鍵處理函式等等。

 Zigbee裝置的分為Coordinator、Router、Enddevice三種角色,通過切換IAR上的標籤可以實現tool目錄下不同的編譯配置

未完。。。。

相關文章