Hi3861_WiFi IoT工程的一點理解html
做者:liangkz 更新時間:2021.04.25 版本:v1.5架構
目錄app
1.關於工程自己 框架
2.ohos_bundles 源碼分析
3.工程的目錄結構 post
更新記錄:
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系統屬性。
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 的截圖:
HalFileXxx() 再下去就到了LiteOS_M內核提供的文件操做接口hi_xxx()了見 #B的截圖。
3. utils_list.h 定義和實現了一個雙向鏈表結構,這個結構很是重要。
恰好我這兩天看到《v01.10鴻蒙內核源碼分析(雙向鏈表篇)》,也推薦去看原文。
公用基礎庫的目錄結構如上圖,細節就不繼續展開了,請自行閱讀理解。
- #B:進入//kernel/liteos_m/目錄,先看readme。
下面這張「LiteOS-M核內核架構圖」,結合 #A上面的截圖(或者完整的鴻蒙系統架構圖),要深刻理解一下:
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/ 目錄,結構上存在一些差別,但基本上不影響理解,我是二者同時對比着看的,鴻蒙系統完整代碼的目錄結構(以下)明顯更加合理:
詳見 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開發板。
源代碼目錄結構不夠詳細,看我再來個稍微完整的表格,再理一下他們之間的調用關係:
這裏 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