Hi3861_WiFi IoT工程:理解IoT外設(shè)控制模塊
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
Hi3861_WiFi IoT工程的一點(diǎn)理解
目錄
- 1.關(guān)于工程本身
- 2.ohos_bundles
- 3.工程的目錄結(jié)構(gòu)
- 4.理解IoT外設(shè)控制模塊
- 4.1 BUILD.gn 的展開(kāi)
- 4.2 led_example.c 的展開(kāi)
- 4.3 IoT外設(shè)控制模塊的整體理解
說(shuō)明:本文是 "Hi3861_WiFi IoT工程的一點(diǎn)理解" 的新增章節(jié),版本升級(jí)到v1.5.
4.理解IoT外設(shè)控制模塊
Hi3861開(kāi)發(fā)板,最主要的功能,就是利用IoT外設(shè)控制模塊提供對(duì)外圍設(shè)備的操作能力,對(duì)外圍設(shè)備操作接口包括了GPIO, I2C, I2S等等,詳情見(jiàn)README。
這一節(jié)我們就從上到下看一下是怎么實(shí)現(xiàn)這些控制的。
我們先看一下官方提供的應(yīng)用示例程序:
- applications\sample\wifi-iot\app\iothardware\ BUILD.gn + led_example.c
4.1 BUILD.gn 的展開(kāi)
.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:進(jìn)到 //utils/native/lite目錄,先看readme。
- 公共基礎(chǔ)庫(kù)存放OpenHarmony通用的基礎(chǔ)組件。這些基礎(chǔ)組件可被OpenHarmony各業(yè)務(wù)子系統(tǒng)及上層應(yīng)用所使用。
- 公共基礎(chǔ)庫(kù)在不同平臺(tái)上提供的能力:
- LiteOS-M內(nèi)核(Hi3861平臺(tái)):KV存儲(chǔ)、文件操作、IoT外設(shè)控制、Dump系統(tǒng)屬性。
- LiteOS-A內(nèi)核(Hi3516、Hi3518平臺(tái)):KV存儲(chǔ)、定時(shí)器、數(shù)據(jù)和文件存儲(chǔ)的JS API、Dump系統(tǒng)屬性。
include目錄包含了很重要的頭文件,應(yīng)用開(kāi)發(fā)或者鴻蒙系統(tǒng)內(nèi)部其他模塊,要調(diào)用這個(gè)公用基礎(chǔ)庫(kù)提供的功能時(shí),都需要包含這個(gè)路徑的頭文件,其中:
1. hos_init.h/ohos_init.h 就定義了 SYS_RUN() 這一組宏,也就是下面led_example.c中使用到的SYS_RUN(LedExampleEntry); 按這里的定義一路展開(kāi),最終會(huì)在通過(guò).zinitcall.run2.init 段中的 __zinitcall_run_app_entry 去執(zhí)行 LedExampleEntry()。
唐佐林老師的《SYS_RUN()和MODULE_INIT()之間的那些事》有非常詳細(xì)的分析,請(qǐng)去看原文。
2. utils_file.h 定義了經(jīng)過(guò)Utils封裝的文件操作接口,UtilsFileXxx() 的實(shí)現(xiàn),就在上一級(jí)的file/ 目錄下,
- UtilsFileXxx()
- {
- return HalFileXxx();
- }
而這個(gè)HalFileXxx() 硬件抽象層的接口,就是下圖的 KAL 這個(gè)位置,也見(jiàn) #B 的截圖:
HalFileXxx() 再下去就到了LiteOS_M內(nèi)核提供的文件操作接口hi_xxx()了見(jiàn) #B的截圖。
3. utils_list.h 定義和實(shí)現(xiàn)了一個(gè)雙向鏈表結(jié)構(gòu),這個(gè)結(jié)構(gòu)非常重要。
剛好我這兩天看到《v01.10鴻蒙內(nèi)核源碼分析(雙向鏈表篇)》,也推薦去看原文。
公用基礎(chǔ)庫(kù)的目錄結(jié)構(gòu)如上圖,細(xì)節(jié)就不繼續(xù)展開(kāi)了,請(qǐng)自行閱讀理解。
- #B:進(jìn)入//kernel/liteos_m/目錄,先看readme。
下面這張“LiteOS-M核內(nèi)核架構(gòu)圖”,結(jié)合 #A上面的截圖(或者完整的鴻蒙系統(tǒng)架構(gòu)圖),要深入理解一下:
KAL(Kernel Abstract Layer,內(nèi)核抽象層),是鴻蒙系統(tǒng)框架層(Framework)與內(nèi)核(LiteOS_M、LiteOS_A、Linux內(nèi)核) 之間的接口,鴻蒙系統(tǒng)框架層與內(nèi)核層是通過(guò)KAL接口進(jìn)行隔離和解耦的。
KAL可以按照cmsis標(biāo)準(zhǔn)或者posix標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)Framework和kernel的對(duì)接,目前代碼看到的是按cmsis-rtos v2 標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)的。
【這里要注意,鴻蒙系統(tǒng)完整代碼下的kernel/liteos_m/ 與本項(xiàng)目的kernel/liteos_m/ 目錄,結(jié)構(gòu)上存在一些差異,但基本上不影響理解,我是兩者同時(shí)對(duì)比著看的,鴻蒙系統(tǒng)完整代碼的目錄結(jié)構(gòu)(如下)明顯更加合理:
詳見(jiàn) README。
但在本工程Hi3861_Wifiiot里,還是按照工程的實(shí)際目錄來(lái)分析?!?/p>
進(jìn)入components目錄:
kal 子目錄,看上去實(shí)現(xiàn)了一組KalXxx()接口,主要是timer相關(guān)的,都是調(diào)用了內(nèi)核的 LOS_Xxx()來(lái)實(shí)現(xiàn)的。
cmsis子目錄,這就是按照cmsis-rtos v2標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)的一組接口,進(jìn)去看一下,主要是獲取內(nèi)核信息、線程管理、timer管理的。我們?cè)趌ed_example.c中調(diào)用的創(chuàng)建線程的接口osThreadNew()就是在這里實(shí)現(xiàn)的。
關(guān)于cmsis-rtos v2標(biāo)準(zhǔn)及相關(guān)接口,建議看官網(wǎng)的Reference:
https://www.keil.com/pack/doc/cmsis/rtos2/html/group__CMSIS__RTOS.html
CSDN上XinLiBK將其翻譯成中文了:
https://blog.csdn.net/u012325601/category_9274156.html
我在《鴻蒙系統(tǒng)的啟動(dòng)流程v3.0》一文中提到,我驗(yàn)證確認(rèn)了Hi3861_Wifiiot\kernel\liteos_m\目錄下的kernel 雖然沒(méi)有編譯,但是components是有編譯的,可以在里面加log,跑起來(lái)可以打印log。
- #C:進(jìn)入//base/iot_hardware/目錄,先看readme。
- IoT外設(shè)控制模塊提供對(duì)外圍設(shè)備的操作能力。
- 本模塊提供如下外圍設(shè)備操作接口:ADC, AT, FLASH, GPIO, I2C, I2S, PARTITION, PWM, SDIO, UART, WATCHDOG等。
- IoT外設(shè)控制模塊使用C語(yǔ)言編寫(xiě),目前僅支持Hi3861開(kāi)發(fā)板。
源代碼目錄結(jié)構(gòu)不夠詳細(xì),看我再來(lái)個(gè)稍微完整的表格,再理一下他們之間的調(diào)用關(guān)系:
這里 include 的 //base/iot_hardware/interfaces/kits/wifiiot_lite 就是上表中“B的聲明”,上下層之間的調(diào)用關(guān)系見(jiàn)最右邊一列。
4.2 led_example.c 的展開(kāi)
好像把上面 4.1 小結(jié)理解透了,led_example.c 也就自然理解了,這里就一筆帶過(guò)。
開(kāi)始:
#include 公用基礎(chǔ)庫(kù)頭文件
#include KAL層提供的cmsis線程管理相關(guān)頭文件
#include 框架層封裝的IoT控制模塊頭文件
1. 通過(guò)公用基礎(chǔ)庫(kù)提供的宏SYS_RUN(LedExampleEntry)引導(dǎo)進(jìn)入LedExampleEntry;
2. LedExampleEntry不能做堵塞類事情,因?yàn)闀?huì)影響其他應(yīng)用的啟動(dòng),調(diào)用cmsis接口創(chuàng)建一個(gè)線程LedTask,專門處理控制Led燈開(kāi)關(guān)的事情。
3. LedTask調(diào)用框架層IoT控制相關(guān)接口(上圖中最右列的調(diào)用B這一步),然后逐層向下調(diào)用,最終實(shí)現(xiàn)LED燈的開(kāi)關(guān)控制。
結(jié)束。
4.3 IoT外設(shè)控制模塊的整體理解
官方提供的上述示例程序,僅僅展示了如何通過(guò)GPIO去控制Hi3861 WLAN主板上的一顆LED燈。
整套開(kāi)發(fā)板還有其他的擴(kuò)展板,包括通用底板、顯示屏板、NFC板、智能三色燈板等等(官方資料包中還提供了更多的擴(kuò)展硬件功能的指導(dǎo)說(shuō)明),板子上不同的硬件分別可以通過(guò)不同的接口去進(jìn)行控制。
要調(diào)試某個(gè)板子的硬件,需要先去 //vendor/hisi/hi3861/hi3861/build/config/usr_config.mk 打開(kāi)對(duì)應(yīng)的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
這些宏會(huì)在系統(tǒng)啟動(dòng)app_main()的peripheral_init()外圍設(shè)備初始化階段,對(duì)相關(guān)控制接口和數(shù)據(jù)接口做初始化,之后就可以進(jìn)行調(diào)試了,調(diào)試套路和相關(guān)控制流程,與上面LED燈的控制大同小異。
整套開(kāi)發(fā)板的的詳細(xì)資料,可以去潤(rùn)和官網(wǎng)去下載:
http://www.hihope.org/download/download.aspx?mtt=8
資料中包含了硬件的數(shù)據(jù)手冊(cè)、原理圖、demo code以及更多的擴(kuò)展說(shuō)明,看起來(lái)可玩性還是蠻高的。
總結(jié):
總的來(lái)說(shuō),Hi3861_WiFiIot開(kāi)發(fā)板+工程項(xiàng)目,還是非常適合新手入門學(xué)習(xí)鴻蒙系統(tǒng)的設(shè)備開(kāi)發(fā)的,從簡(jiǎn)單的東西入手,可以逐步漸進(jìn),把系統(tǒng)架構(gòu)圖中的:上下層次關(guān)系、模塊組件關(guān)系等各種流程都理一遍,不至于一步踏進(jìn)完整鴻蒙系統(tǒng)的汪洋大海中,舉足難進(jìn)。
下一步的學(xué)習(xí),還是先以這個(gè)工程為主,結(jié)合完整鴻蒙的代碼,其他還沒(méi)有涉足的模塊/組件都去了解一下,把板子玩熟,把設(shè)備開(kāi)發(fā)的整體通路打通,形成自己的理解體系,多做總結(jié)進(jìn)行分享,為鴻蒙生態(tài)貢獻(xiàn)微薄之力。
以上,也算是我對(duì)前一階段自己學(xué)習(xí)的所得的一點(diǎn)總結(jié)吧。
寫(xiě)到這里,我想喊一句口號(hào),類似“邁出第一小步,夢(mèng)想是星辰大海”之類的,突然想起hb set的產(chǎn)品類別名稱:wifiiot_hispark_pegasus,說(shuō)的不就是這個(gè)意思嗎,從spark到pegasus,從星星之火到星辰大海。
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)