干货分享丨轻松玩转 Huawei LiteOS 传感框架
摘要:LiteOS传感框架将物联网终端设备上不同类型的传感器统一管理,通过抽象不同类型传感器接口,屏蔽其硬件细节,做到“硬件”无关性,非常方便于物联网设备的开发、维护和功能扩展。
LiteOS传感框架是什么
随着物联网的发展,物联网终端越来越智能化,例如在个人穿戴、智能家居、家用医疗等终端上将配置越来越多的传感器,来获取更多传感数据,使终端更加智能,使得开发和维护变得复杂和困难。LiteOS传感框架将物联网终端设备上例如加速计(Accelerometer)、陀螺仪(Gyroscope)、气压仪(Barometer)、温湿度计(Humidometer)等不同类型的传感器统一管理,通过抽象不同类型传感器接口,屏蔽其硬件细节,做到“硬件”无关性,非常方便于物联网设备的开发、维护和功能扩展。
LiteOS传感框架架构介绍

LiteOS传感框架主要包括了Sensor Manager、BSP manager,Converged Algorithms。
- Sensor Manager:统一的传感器交互管理,如Sensor的配置、采样、上报和管理。
- BSP Manager:统一的驱动接口,负责Sensor驱动管理、电源管理、Sensor交互管理,如Sensor的打开、关闭、读写、数据更新等。
- Converged Algorithms:融合算法库(算法基于具体的业务模型),根据具体业务模型,在端侧MCU进行算法融合,例如环境监测算法、计步算法等,从传统、简单采集算法升级到智能算法,应用直接调用,提升传感数据的业务精准度,降低数据采集时延。
LiteOS传感框架特点
- 提升开发效率,降低开发难度:LiteOS传感框架实现对物联网终端Sensor的统一管理,对不同类型传感器进行抽象,软件工程师专注于功能开发,硬件工程师专注于底层驱动适配,开发人员不需要懂软件又懂硬件,降低了开发难度,提升了开发效率。
- 软件架构分层分级,方便功能扩展和维护:由于软件架构分层,非常方便于物联网设备日后的维护和扩展升级。
LiteOS传感框架适用的场景
LiteOS传感框架是LiteOS物联网操作系统的Sensor管理框架,适应于多种物联网终端的开发。对于智能化、低功耗、多种Sensor、产品更新迭代快的终端设备,更能体现出传感框架的优势,例如可穿戴设备、智能家居设备、家用医疗设备等等。

例如在运动手表(手环)中,就有心率测量(PPG)、环境光、加速度计、磁力计、气压计、GPS等多种传感器,数据上报频繁复杂,不同传感器数据需要协同运算处理,对数据采集、传输、处理提出了更高的要求,同时设计通用的软件平台、提升续航指标也面临巨大挑战。使用SensorHub传感框架有效解决了通用性问题。另外统一的传感器周期管理,还有效减少了无用的中断唤醒,再结合LiteOS出色的低功耗管理能力,助力产品快速上市,具有很好的竞争力。
LiteOS传感框架功能接口

LiteOS传感框架开发流程
使用Sensor Manager管理某一类别传感器典型流程如下:
1.任务、队列、信号量等资源SensorManagerInit。
2.初始化SensorType结构体变量,并注册传感器SensorRegister。
3.通过SensorTableGet获取传感器列表,执行已注册传感器的初始化动作。
4.根据需要配置传感器参数SensorConfigNotify。
5.初始化相同类别标签的传感器应用SensorItemInit,并提供应用Id和数据更新回调函数。
6.打开传感器应用SensorItemEnable,并提供应用采样周期,传感器驱动会根据打开参数的时间间隔创建软件定时器并启动,定时时间到达后则调用SensorSample通知Sensor Manager 读取数据,同时根据采样周期设置推送数据到该应用注册的回调函数。
7.关闭传感器应用SensorItemDisable,停止推送数据到该应用。
传感器消息处理、发送根据具体业务需求增加。
一个编程实例
我们最后通过一个例子,便于大家了解如何使用LitOS传感框架进行快速开发。
本实例中提供的传感器驱动和应用代码仅对使用传感框架读取传感器做基本设计和实现,仅做参考。
硬件设备:
野火挑战者开发板(Cloud_STM32F429IGTx_FIRE)。MPU6050是一种六轴传感器模块,能同时检测三轴加速度、三轴陀螺仪(角加速度)、温度。
开发任务:
开发应用定时读取开发板MPU6050传感器的原始数据。
开发步骤:
- 初始化陀螺仪标签类别的两个应用g_gyroItem1、g_gyroItem2。
- 设置不同的采集周期,打开应用,注册数据更新回调函数SensorReport。
- 采集一段时间后,先关闭g_gyroItem1,此时传感器数据会继续推送g_gyroItem2,一段时间后,关闭g_gyroItem2,此时传感器数据采样停止,SensorReport不再被调用。
- 再执行一遍2、3步骤。
实例代码:
#define STASK_PRIORITY_MISC 4
#define STASK_STKDEPTH_MISC 0x800
#define Item1_SAMPLE_INTERVAL 3000 // LiteOS ticks
#define Item2_SAMPLE_INTERVAL 6000
STATIC SensorItem g_gyroItem1 = {
.id = 1, // 1: gyro item 1
};
STATIC SensorItem g_gyroItem2 = {
.id = 2, // 2: gyro item 2
};
STATIC UINT32 g_miscTskID;
STATIC INT32 SensorReport(UINT32 arg, const INT8 *data, UINT32 len)
{
(VOID)(len);
(VOID)(data);
PRINTK("tag %u report\r\n", arg);
return LOS_OK;
}
STATIC VOID OpenGyro(VOID)
{
OpenParam para;
// period is LiteOS ticks
para.period = Item1_SAMPLE_INTERVAL;
SensorItemEnable(&g_gyroItem1, ¶, g_gyroItem1.id, 0);
para.period = Item2_SAMPLE_INTERVAL;
SensorItemEnable(&g_gyroItem2, ¶, g_gyroItem2.id, 0);
}
STATIC VOID CloseGyro(VOID)
{
CloseParam para;
SensorItemDisable(&g_gyroItem1, ¶, g_gyroItem1.id, 0);
// keep item2 working for 40000 ticks
LOS_TaskDelay(40000);
SensorItemDisable(&g_gyroItem2, ¶, g_gyroItem2.id, 0);
}
STATIC VOID InitGyro(VOID)
{
SensorType *sensor = NULL;
SensorScbTable *scbTable = NULL;
// init gyro sensor
scbTable = SensorTableGet();
sensor = scbTable[TAG_GYRO - TAG_BEGIN].sensorInterface;
if ((sensor != NULL) && (sensor->sensorOp != NULL)) {
(VOID)sensor->sensorOp->Init(sensor);
}
// init item
SensorItemInit(&g_gyroItem1, NULL, TAG_GYRO, SensorReport, TAG_GYRO);
SensorItemInit(&g_gyroItem2, NULL, TAG_GYRO, SensorReport, TAG_GYRO);
}
STATIC VOID MiscTask(VOID const *arg)
{
(VOID)(arg);
// I2C init
I2cMaster_Init();
SensorManagerInit();
LOS_TaskDelay(1000);
GyroSensorRegister();
InitGyro();
OpenGyro();
LOS_TaskDelay(20000);
CloseGyro();
OpenGyro();
LOS_TaskDelay(100000);
CloseGyro();
}
VOID MiscInit(VOID)
{
UINT32 ret;
TSK_INIT_PARAM_S taskInitParam = {0};
taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)MiscTask;
taskInitParam.uwStackSize = STASK_STKDEPTH_MISC;
taskInitParam.pcName = "Misc Task";
taskInitParam.usTaskPrio = STASK_PRIORITY_MISC; /* 1~7 */
taskInitParam.uwResved = LOS_TASK_STATUS_DETACHED; /* task is detached, the task can deleteself */
ret = LOS_TaskCreate(&g_miscTskID, &taskInitParam);
if (ret != LOS_OK) {
PRINT_ERR("Misc Task create fail\n");
return;
}
PRINT_DEBUG("MiscTask init \n");
}
结果验证
传感器采样的第一个数据会推送至所有相关应用,然后每个应用在自己的周期到来时才会收到传感器的数据。

图1 实例结果显示
下载Huawei LiteOS源代码,快快体验一下吧。
传感框架代码路径:https://gitee.com/LiteOS/LiteOS/tree/master/components/sensorhub。
干货分享丨轻松玩转 Huawei LiteOS 传感框架的更多相关文章
- 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)
作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...
- 科普干货|漫谈鸿蒙LiteOS-M与HUAWEI LiteOS内核的几大不同
摘要:鸿蒙和LiteOS的内核都是一样的名字,可它们究竟有什么不同呢?一起来对比一下文件吧! HarmonyOS系统 HarmonyOS是一款"面向未来".面向全场景(移动办公.运 ...
- 2021 .NET Conf China 主题分享之-轻松玩转.NET大规模版本升级
去年.NET Conf China 技术大会上,我给大家分享了主题<轻松玩转.NET大规模版本升级>,今天把具体分享的内容整理成一篇博客,供大家研究参考学习. 一.先说一下技术挑战和业务背 ...
- 干货分享丨玩转物联网IoTDA服务系列五-智能家居煤气检测联动
摘要:该场景主要描述的是设备可以通过LWM2M协议与物联网平台进行交互,用户可以在控制台或通过应用侧接口创建设备联动规则,把设备上报的属性转发,通过物联网平台规则引擎转变成命令下发给其他指定设备. 场 ...
- 干货分享丨玩转物联网IoTDA服务系列四-智能网关
摘要:该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,用户可以在控制台产品详情中自定义Topic,通过应用侧接口或控制台创建数据转发规则,把设备上报的消息转发给其他华为云服务,供应用侧 ...
- 干货分享丨jvm系列:dump文件深度分析
摘要:java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因.那么dump文件的内容是什么样的呢? JVM ...
- 干货分享:SQLSERVER使用裸设备
干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...
- iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ②)
距上一篇博客"APP引导页的高度集成 - DHGuidePageHUD - ①"的发布有一段时间了, 后来又在SDK中补充了一些新的内容进去但是一直没来得及跟大家分享, 今天来跟大 ...
- iOS - GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD - ①)
好长时间没更新博客, 是时候来一波干货分享了;APP引导页话不多说每一个APP都会用到,分量不重但是不可缺少,不论是APP的首次安装还是版本的更新,首先展现给用户眼前的也就只有它了吧,当然这里讲的不是 ...
- 【干货分享】Google 的设计准则,素材和资源
在谷歌,他们说, “专注于用户,所有其它的就会水到渠成 ”.他们遵循设计原则,寻求建立让用户惊喜的用户体验.谷歌一直挑战自己,为他们的用户创造一种视觉语言,综合优秀设计的经典原则和创新.谷歌设计规范是 ...
随机推荐
- Epic资源转到unity的方法
众所周知,unity中的素材主要是通过unity资源商店获取的.但是unity资源商店的白嫖机会太少了,而隔壁UE的Epic资源商店就有每月免费的资源,不白嫖成何体统?但是UE咱也不会用啊,白嫖的资源 ...
- JS中的caller属性
JS中的caller属性: 这个属性会返回一个调用该函数对象的外层函数引用.也就是说,如果我们是在函数B()中调用函数A()的,那么只要在A()中调用A.caller,结果就会返回B()functio ...
- FSCTF 2023(公开赛道)CRYPTO WP
RSA 1 1.题目信息 提交格式:FSCTF{你所解出的内容} p=1458769258361 q=4556983871563 e=17 求d 2.解题方法 exp from gmpy2 impor ...
- java_2.常量、Scanner类、基本数据类型转换、算数运算符
常量.Scanner类.基本数据类型转换.算数运算符 变量和常量 常量 1.使用final关键字修饰,只能赋值一次,不可以修改值. 2.常量的名称使用全大写. 3.多个单词使用下划线分隔. publi ...
- MATLAB(Octave)命令记录
1. struct:结构体数组 aaaa_s.a = 1; aaaa_s.b = {'A','B','C'} aaaa_s.c = [1 2 3 4; 5 6 7 8]; save aaaa_s.tx ...
- Java安全机制之一——SecurityManager和AccessController
前言: 在看socket相关代码的时候,AbstractPlainSocketImpl中的一段代码吸引了我,其实之前见过很多次类似的代码,但一直不想去看,只知道肯定和权限什么的相关,这次既然又碰到了就 ...
- 解决Few-shot问题的两大方法:元学习与微调
.center { width: auto; display: table; margin-left: auto; margin-right: auto } 基于元学习(Meta-Learning)的 ...
- mobaxterm软件的使用
MobaXterm是一款功能强大的多功能远程计算机管理软件,可以在Windows操作系统下运行,支持SSH.Telnet.RDP.VNC等协议 一.软件下载与安装 下载地址:https://mobax ...
- Istio 网格的出口定义者:深入了解 Egress Gateway
本文分享自华为云社区<Istio Egress 出口网关使用>,作者:k8s技术圈. 前面我们了解了位于服务网格内部的应用应如何访问网格外部的 HTTP 和 HTTPS 服务,知道如何通过 ...
- 有什么巨好用Excel数据分析技巧?
当涉及Excel数据分析时,以下是一些非常实用的技巧和功能,供您参考.这里将为您提供关于数据整理.数据清洗.统计分析.可视化和高级分析等方面的技巧. 一.数据整理与清洗: 导入数据:使用 Excel ...