Hi3861_WiFi IoT工程:理解IoT外设控制模块
Hi3861_WiFi IoT工程的一点理解
作者:liangkz 更新时间:2021.04.25 版本:v1.5
目录
更新记录:
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内核(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(); }
- 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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
优化技术专题-系统服务优化系列-CPU处理器鲜为人知的那些秘密
前提概要 所谓,知彼知己百战不殆,针对于计算机的优化技术来讲,最底层也不过是针对于CPU技术的优化了,但是如果要区优化程序,涉及到CPU的执行能力,那必须要了解CPU的原理和概念以及执行过程等概念,所以小编写了本片的目的就是针对于CPU的相关知识进行讲解,当你对CPU不在陌生的时候,也就是你超神的时候了,哈哈...... CPU相关的知识 本文介绍涉及到的知识点包含,多CPU、物理核、逻辑核、超线程、进程、线程、并发、并行,以及Linux查询CPU和核的信息的方法 易混淆概念 多处理器 认真辨别语境,通常是多CPU的意思;有时多是多逻辑处理器即多核的意思,好像老外常常把一个CPU里有多个核心当成多个CPU来描述。 逻辑处理器 就是逻辑核的意思,Windows 10的中文翻译了这个特别特别容易误解的词,我觉得就是可以理解为内核程序单位。 逻辑CPU 有人用了这个词表示逻辑核的意思,但是用法的根据我保持怀疑,很容易致使误解,由于我会认为,核就是核,CPU就是CPU,为何混为一谈,好像核就是CPU同样缓存。 CPU的一~四级缓存 CPU缓存(Cache Memory)的出现是弥补CPU和主存...
- 下一篇
一个关于nginx+php 的性能优化小测试
准备工作 一台ECS服务器 手动编译nginx+php 修改index.php ,输出 ‘hello world’ 用ab工具,ab -c 100 -n 50000 ,连续5次,记录压测的qps平均值。 想办法去优化,调整各种参数。每次调整一个参数有发现QPS提高,那就记录下来,并思考qps瓶颈是在哪 Nginx 一些基本配置的描述 user administrator administrators; #配置用户或者组,默认为nobody nobody。 worker_processes 2; #允许生成的进程数,默认为1 pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址 error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on multi_acce...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS关闭SELinux安全模块