Hi3861_WiFi IoT工程:理解IoT外設控制模塊
Hi3861_WiFi IoT工程的一點理解
目錄
- 1.關于工程本身
- 2.ohos_bundles
- 3.工程的目錄結構
- 4.理解IoT外設控制模塊
- 4.1 BUILD.gn 的展開
- 4.2 led_example.c 的展開
- 4.3 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內核(Hi3516、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();
- }
而這個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里,還是按照工程的實際目錄來分析?!?/p>
進入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
這些宏會在系統啟動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,從星星之火到星辰大海。