Hi3861_WiFi IoT工程:理解IoT外設控制模塊

Hi3861_WiFi IoT工程的一點理解html

做者:liangkz  更新時間:2021.04.25  版本:v1.5架構

目錄app

1.關於工程自己 框架

2.ohos_bundles 源碼分析

3.工程的目錄結構 post

4.理解IoT外設控制模塊 學習

      4.1  BUILD.gn 的展開 ui

      4.2  led_example.c 的展開 url

      4.3  IoT外設控制模塊的總體理解 spa

 

更新記錄:

2021.04.23 v1.0 初始版本,前3節。
2021.04.25 v1.5 增長第4節,理解IoT外設控制模塊。


說明:本文是 "Hi3861_WiFi IoT工程的一點理解" 的新增章節,版本升級到v1.5.

 

4.理解IoT外設控制模塊
Hi3861開發板,最主要的功能,就是利用IoT外設控制模塊提供對外圍設備的操做能力,對外圍設備操做接口包括了GPIO, I2C, I2S等等,詳情見README。

這一節咱們就從上到下看一下是怎麼實現這些控制的。

 

咱們先看一下官方提供的應用示例程序:

applications\sample\wifi-iot\app\iothardware\ BUILD.gn + led_example.c

 

4.1  BUILD.gn 的展開
.c 文件等下再看,先看BUILD.gn:

    include_dirs = [

        "//utils/native/lite/include",                                    # A

        "//kernel/liteos_m/components/cmsis/2.0",           # B

        "//base/iot_hardware/interfaces/kits/wifiiot_lite",  # C

    ]

 

  • #A:進到 //utils/native/lite目錄,先看readme。

公共基礎庫存放OpenHarmony通用的基礎組件。這些基礎組件可被OpenHarmony各業務子系統及上層應用所使用。

公共基礎庫在不一樣平臺上提供的能力:

LiteOS-M內核(Hi3861平臺):KV存儲、文件操做、IoT外設控制、Dump系統屬性。

LiteOS-A內核(Hi351六、Hi3518平臺):KV存儲、定時器、數據和文件存儲的JS API、Dump系統屬性。

Hi3861_WiFi IoT工程:理解IoT外設控制模塊

include目錄包含了很重要的頭文件,應用開發或者鴻蒙系統內部其餘模塊,要調用這個公用基礎庫提供的功能時,都須要包含這個路徑的頭文件,其中:

1. hos_init.h/ohos_init.h 就定義了 SYS_RUN() 這一組宏,也就是下面led_example.c中使用到的SYS_RUN(LedExampleEntry); 按這裏的定義一路展開,最終會在經過.zinitcall.run2.init 段中的 __zinitcall_run_app_entry 去執行 LedExampleEntry()。

 

唐佐林老師的《SYS_RUN()和MODULE_INIT()之間的那些事》有很是詳細的分析,請去看原文。

 

2. utils_file.h 定義了通過Utils封裝的文件操做接口,UtilsFileXxx() 的實現,就在上一級的file/ 目錄下,

UtilsFileXxx()
{
    return HalFileXxx();  
}
  • 1.
  • 2.
  • 3.
  • 4.
 

 而這個HalFileXxx() 硬件抽象層的接口,就是下圖的 KAL 這個位置,也見 #B 的截圖:

Hi3861_WiFi IoT工程:理解IoT外設控制模塊

HalFileXxx() 再下去就到了LiteOS_M內核提供的文件操做接口hi_xxx()了見 #B的截圖。

 

3. utils_list.h 定義和實現了一個雙向鏈表結構,這個結構很是重要。

恰好我這兩天看到《v01.10鴻蒙內核源碼分析(雙向鏈表篇)》,也推薦去看原文。

 

公用基礎庫的目錄結構如上圖,細節就不繼續展開了,請自行閱讀理解。

 

  • #B:進入//kernel/liteos_m/目錄,先看readme。

下面這張「LiteOS-M核內核架構圖」,結合 #A上面的截圖(或者完整的鴻蒙系統架構圖),要深刻理解一下:Hi3861_WiFi IoT工程:理解IoT外設控制模塊

KAL(Kernel Abstract Layer,內核抽象層),是鴻蒙系統框架層(Framework)與內核(LiteOS_M、LiteOS_A、Linux內核) 之間的接口,鴻蒙系統框架層與內核層是經過KAL接口進行隔離和解耦的。

KAL能夠按照cmsis標準或者posix標準來實現Framework和kernel的對接,目前代碼看到的是按cmsis-rtos v2 標準來實現的。

 

【這裏要注意,鴻蒙系統完整代碼下的kernel/liteos_m/ 與本項目的kernel/liteos_m/ 目錄,結構上存在一些差別,但基本上不影響理解,我是二者同時對比着看的,鴻蒙系統完整代碼的目錄結構(以下)明顯更加合理:Hi3861_WiFi IoT工程:理解IoT外設控制模塊

詳見 README。

但在本工程Hi3861_Wifiiot裏,仍是按照工程的實際目錄來分析。】

 

進入components目錄:

kal 子目錄,看上去實現了一組KalXxx()接口,主要是timer相關的,都是調用了內核的 LOS_Xxx()來實現的。

cmsis子目錄,這就是按照cmsis-rtos v2標準來實現的一組接口,進去看一下,主要是獲取內核信息、線程管理、timer管理的。咱們在led_example.c中調用的建立線程的接口osThreadNew()就是在這裏實現的。

 

關於cmsis-rtos v2標準及相關接口,建議看官網的Reference:

https://www.keil.com/pack/doc/cmsis/rtos2/html/group__CMSIS__RTOS.html

CSDN上XinLiBK將其翻譯成中文了:

https://blog.csdn.net/u012325601/category_9274156.html

 

我在《鴻蒙系統的啓動流程v3.0》一文中提到,我驗證確認了Hi3861_Wifiiot\kernel\liteos_m\目錄下的kernel 雖然沒有編譯,可是components是有編譯的,能夠在裏面加log,跑起來能夠打印log。

 

  • #C:進入//base/iot_hardware/目錄,先看readme。

IoT外設控制模塊提供對外圍設備的操做能力。

本模塊提供以下外圍設備操做接口:ADC, AT, FLASH, GPIO, I2C, I2S, PARTITION, PWM, SDIO, UART, WATCHDOG等。

IoT外設控制模塊使用C語言編寫,目前僅支持Hi3861開發板。

源代碼目錄結構不夠詳細,看我再來個稍微完整的表格,再理一下他們之間的調用關係:Hi3861_WiFi IoT工程:理解IoT外設控制模塊

這裏 include 的 //base/iot_hardware/interfaces/kits/wifiiot_lite 就是上表中「B的聲明」,上下層之間的調用關係見最右邊一列。

 

4.2  led_example.c 的展開
好像把上面 4.1 小結理解透了,led_example.c 也就天然理解了,這裏就一筆帶過。

 

開始:

#include 公用基礎庫頭文件

#include  KAL層提供的cmsis線程管理相關頭文件

#include 框架層封裝的IoT控制模塊頭文件

 

1. 經過公用基礎庫提供的宏SYS_RUN(LedExampleEntry)引導進入LedExampleEntry;

2. LedExampleEntry不能作堵塞類事情,由於會影響其餘應用的啓動,調用cmsis接口建立一個線程LedTask,專門處理控制Led燈開關的事情。

3. LedTask調用框架層IoT控制相關接口(上圖中最右列的調用B這一步),而後逐層向下調用,最終實現LED燈的開關控制。

結束。

 

4.3  IoT外設控制模塊的總體理解
官方提供的上述示例程序,僅僅展現瞭如何經過GPIO去控制Hi3861 WLAN主板上的一顆LED燈。

整套開發板還有其餘的擴展板,包括通用底板、顯示屏板、NFC板、智能三色燈板等等(官方資料包中還提供了更多的擴展硬件功能的指導說明),板子上不一樣的硬件分別能夠經過不一樣的接口去進行控制。

要調試某個板子的硬件,須要先去 //vendor/hisi/hi3861/hi3861/build/config/usr_config.mk 打開對應的SUPPORT宏:

# BSP Settings
#
# CONFIG_I2C_SUPPORT is not set
# CONFIG_I2S_SUPPORT is not set
# CONFIG_SPI_SUPPORT is not set
# CONFIG_DMA_SUPPORT is not set
# CONFIG_SDIO_SUPPORT is not set
# CONFIG_SPI_DMA_SUPPORT is not set
# CONFIG_UART_DMA_SUPPORT is not set
# CONFIG_PWM_SUPPORT is not set
# CONFIG_PWM_HOLD_AFTER_REBOOT is not set
CONFIG_AT_SUPPORT=y
CONFIG_FILE_SYSTEM_SUPPORT=y
CONFIG_UART0_SUPPORT=y
CONFIG_UART1_SUPPORT=y
# CONFIG_UART2_SUPPORT is not set
# end of BSP Settings
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
 

這些宏會在系統啓動app_main()的peripheral_init()外圍設備初始化階段,對相關控制接口和數據接口作初始化,以後就能夠進行調試了,調試套路和相關控制流程,與上面LED燈的控制大同小異。

 

整套開發板的的詳細資料,能夠去潤和官網去下載:

http://www.hihope.org/download/download.aspx?mtt=8

資料中包含了硬件的數據手冊、原理圖、demo code以及更多的擴展說明,看起來可玩性仍是蠻高的。

 

 

總結:

        總的來講,Hi3861_WiFiIot開發板+工程項目,仍是很是適合新手入門學習鴻蒙系統的設備開發的,從簡單的東西入手,能夠逐步漸進,把系統架構圖中的:上下層次關係、模塊組件關係等各類流程都理一遍,不至於一步踏進完整鴻蒙系統的汪洋大海中,舉足難進。

        下一步的學習,仍是先以這個工程爲主,結合完整鴻蒙的代碼,其餘尚未涉足的模塊/組件都去了解一下,把板子玩熟,把設備開發的總體通路打通,造成本身的理解體系,多作總結進行分享,爲鴻蒙生態貢獻微薄之力。

        以上,也算是我對前一階段本身學習的所得的一點總結吧。

 

        寫到這裏,我想喊一句口號,相似「邁出第一小步,夢想是星辰大海」之類的,忽然想起hb set的產品類別名稱:wifiiot_hispark_pegasus,說的不就是這個意思嗎,從spark到pegasus,從星星之火到星辰大海。

 

做者:liangkz

想了解更多內容,請訪問51CTO和華爲合做共建的鴻蒙社區:https://harmonyos.51cto.com

相關文章
相關標籤/搜索