当前位置: 首页 > 科技观察

Hi3861_WiFi物联网项目:认识物联网外设控制模块

时间:2023-03-20 18:41:35 科技观察

更多内容请访问:与华为共建的鸿蒙技术社区官方https://harmonyos.51cto.comHi3861_WiFi物联网项目一点认识目录1.关于项目本身2.ohos_bundles3.项目的目录结构4.理解物联网外设控制模块4.1BUILD.gn扩展4.2led_example.c扩展4.3物联网外设控制模块的整体理解说明:本文是《Hi3861_WiFi物联网项目》的一个要点新章节《懂》,版本升级到v1.5.4.懂物联网外设控制模块Hi3861开发板,主要功能是利用物联网外设控制模块提供操作外设的能力,以及外设操作接口包括GPIO、I2C、I2S等,详见README,本节我们将看看如何实现这些控制ols从上到下。先来看看官方的应用示例程序:applications\sample\wifi-iot\app\iothardware\BUILD.gn+led_example.c4.1BUILD.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目录,先阅读自述文件。公共基础库存放了OpenHarmony常用的基础组件。这些基础组件可供OpenHarmony的各种业务子系统和上层应用使用。公共基础库在不同平台上提供的能力:LiteOS-M内核(Hi3861平台):KV存储、文件操作、IoT外设控制、Dump系统属性。LiteOS-A内核(Hi3516、Hi3518平台):KV存储、定时器、数据和文件存储JSAPI、Dump系统属性。include目录包含非常重要的头文件。当应用开发或者鸿蒙系统中的其他模块要调用这个公共基础库提供的函数时,必须包含这个路径的头文件,其中:1.hos_init.h/ohos_init.hSYS_RUN()组定义了宏的个数,即后面的led_example.c中使用的SYS_RUN(LedExampleEntry);按照这里的定义一路展开,最后通过.zinitcall.run2.init段LedExampleEntry()中的__zinitcall_run_app_entry执行。唐作霖老师的《SYS_RUN()和MODULE_INIT()之间的那些事》有很详细的分析,请看原文。2、utils_file.h定义了Utils封装的文件操作接口。UtilsFileXxx()的实现在上层的file/目录下。UtilsFileXxx(){returnHalFileXxx();}和这个HalFileXxx()硬件抽象层接口就是下图中KAL的位置,又见#B的截图:HalFileXxx()然后进入文件操作接口hi_xxx()由LiteOS_M内核提供。请参见#B的屏幕截图。3、utils_list.h定义并实现了一个双向链表结构,这个很重要。正好这两天看到《v01.10鸿蒙内核源码分析(双向链表篇)》,也推荐看原文。公共基础库的目录结构如上图所示,不再赘述。请自行阅读理解。#B:进入目录//kernel/liteos_m/,先阅读readme。下面这张《LiteOS-M核心内核架构图》,结合上面#A的截图(或者完整的鸿蒙系统架构图),需要深入理解:KAL(KernelAbstractLayer,内核抽象层),是框架鸿蒙系统框架层(Framework)和内核(LiteOS_M、LiteOS_A、Linuxkernel),鸿蒙系统框架层和内核层通过KAL接口隔离解耦。KAL可以按照cmsis标准或者posix标准实现Framework和kernel的连接。目前代码是按照cmsis-rtosv2标准实现的。【这里需要注意的是,鸿蒙系统完整代码下的kernel/liteos_m/目录与本项目的kernel/liteos_m/目录结构有些差异,但基本不影响理解。我同时比较了两者。鸿蒙系统完整代码(下)的目录结构显然更加合理:详见README。但是在Hi3861_Wifiiot这个项目中,还是按照项目的实际目录来分析。】进入components目录:kal子目录,好像实现了一套KalXxx()接口,主要是定时器相关,通过调用内核的LOS_Xxx()实现。cmsis子目录是一组按照cmsis-rtosv2标准实现的接口。进去看看,主要是获取内核信息,线程管理,定时器管理。我们在led_example.c中调用的线程创建接口osThreadNew()就是在这里实现的。关于cmsis-rtosv2标准及相关接口,推荐阅读官网参考:https://www.keil.com/pack/doc/cmsis/rtos2/html/group__CMSIS__RTOS.htmlXinLiBK已经翻译了在CSDN上翻译成中文:https://blog.csdn.net/u012325601/category_9274156.html我在《鸿蒙系统的启动流程v3.0》一文中提到,我验证确认虽然Hi3861_Wifiiot\kernel\liteos_m\目录下的内核没有编译,组件已编译,可以在Addlogtoit中找到,运行时可以打印日志。#C:进入//base/iot_hardware/目录,先阅读readme。物联网周边控制模块提供操作周边设备的能力。本模块提供以下外围设备操作接口:ADC、AT、FLASH、GPIO、I2C、I2S、PARTITION、PWM、SDIO、UART、WATCHDOG等。物联网外围控制模块采用C语言编写,目前仅支持Hi3861开发板。源代码目录结构不够详细。我先创建一个稍微完整一点的表格,然后再梳理一下它们之间的调用关系:这里include//base/iot_hardware/interfaces/kits/wifiiot_lite就是上表中的“B语句”,它们之间的调用关系上层和下层显示在最右边的列中。4.2led_example.c的展开上面4.1的总结好像已经完全理解了,led_example.c也自然理解了,这里简单提一下。开始:#include公共基础库头文件#includeKAL层提供的cmsis线程管理相关头文件#includeframework层封装的物联网控制模块头文件1.通过公共基础库提供的宏SYS_RUN(LedExampleEntry)进入LedExampleEntry;2.LedExampleEntry不能做阻塞的事情,因为它会影响其他应用程序的启动。调用cmsis接口创建线程LedTask,专门控制Led灯的开关。3、LedTask调用框架层物联网控制相关接口(上图中最右边一栏调用B的步骤),然后逐层往下调用,最终实现对LED灯的开关控制。结束。4.3物联网外设控制模块的整体理解上面官方提供的示例程序只展示了如何通过GPIO控制Hi3861WLAN主板上的一个LED灯。整套开发板还有其他扩展板,包括通用底板、显示板、NFC板、智能三色灯板等,可以通过不同接口控制硬件。要调试某个板子的硬件,需要先去//vendor/hisi/hi3861/hi3861/build/config/usr_config.mk打开对应的SUPPORT宏:#BSPSettings##CONFIG_I2C_SUPPORTisnotset#CONFIG_I2S_SUPPORTisnotset#CONFIG_SPI_SUPPORTisnotset#CONFIG_DMA_SUPPORTisnotset#CONFIG_SDIO_SUPPORTisnotset#CONFIG_SPI_DMA_SUPPORTisnotset#CONFIG_UART_DMA_SUPPORTisnotset#CONFIG_PWM_SUPPORTisnotset#CONFIG_PWM_HOLD_AFTER_REBOOTisnotsetCONFIG_AT_SUPPORT=yCONFIG_FILE_SYSTEM_SUPPORT=yCONFIG_UART0_SUPPORT=yCONFIG_UART1_SUPPORT=y#CONFIG_UART2_SUPPORTisnotset#endofBSPSettings这些宏会在系统启动app_main()的peripheral_init()外围设备初始化阶段,对相关控制接口和数据接口做初始化,之后就可以进行调试Yes,thedebuggingroutineandrelatedcontrolprocessaresimilartothecontroloftheLEDlightsabove.Forthedetailedinformationofthewholesetofdevelopmentboard,youcangotoRunheofficialwebsitetodownload:http://www.hihope.org/download/download.aspx?mtt=8Theinformationincludesthehardwaredatamanual,schematicdiagram,democodeandMoreexpansioninstructions,itseemsthattheplayabilityisquitehigh.Summary:Ingeneral,theHi3861_WiFiIotdevelopmentboard+engineeringprojectisstillverysuitableforbeginnerstolearntheequipmentdevelopmentoftheHongmengsystem.Startingfromsimplethings,youcangraduallyprogress,andintegratethesystemarchitecturediagram:upperandlowerhierarchicalrelationships,modulecomponentsAllkindsofprocessessuchasrelationshipshavebeensortedout,soasnottostepintothevastoceanofthecompleteHongmengsystem,anditisdifficulttoadvance.Thenextstepoflearningistofocusonthisprojectfirst,combinethecompleteHongmengcode,andlearnaboutothermodules/componentsthathavenotbeeninvolved,getfamiliarwiththeboard,openuptheoverallpathofequipmentdevelopment,andformyourownunderstandingsystem,makemoresummariesandshare,andcontributealittletotheHongmengecology.以上可以算是我对上一阶段所学内容的总结。写到这里,想喊一句口号,类似“踏出第一步,梦想是星辰大海”之类的话,突然想起hbset的产品品类名称:wifiiot_hispark_pegasus,是不是我说的,从火花到飞马,从一团火到星辰大海。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区