干货分享丨轻松玩转 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 的设计准则,素材和资源
在谷歌,他们说, “专注于用户,所有其它的就会水到渠成 ”.他们遵循设计原则,寻求建立让用户惊喜的用户体验.谷歌一直挑战自己,为他们的用户创造一种视觉语言,综合优秀设计的经典原则和创新.谷歌设计规范是 ...
随机推荐
- 多源异构数据信息的融合方式0 - Dempster/Shafer 证据理论(D-S证据理论)
Dempster/Shafer 证据理论(D-S证据理论)的大体内容如下: 一.简介: 在理论中,由互不相容的基本命题组成的完备集合Θ称为识别框架,表示对于某一问题的所有可能答案,但是只有一个答案是正 ...
- Java开发面试--群面专区
目录 一.群面背景 二.群面流程 三.群面角色 四.群面细节 五.群面礼仪 六.群面话术 七.个人演讲 八.群面题型 群面也称无领导小组~ 候选人们被要求在一个相对自由的环境中展示他们的能力,并在没有 ...
- NOI 2023 游记
Day0=2023.7.23. Day -?? 订了 30 个徽章.很快认识到可能不够,又自己买了 30 个. Day -? UNR,完全没有精神状态于是两天都考半场睡半场.0+10+55,成功 Fe ...
- picgo+GitHub搭建图床
picgo+GitHub 搭建图床 目录 picgo+GitHub 搭建图床 图床的概念 使用 GitHub 创建图床服务器 在 GitHub 上面新建仓库 生成 token 令牌 创建 img 分支 ...
- 搭建Samba服务器笔记全套
Top 目录 安装 端口与服务管理 其他常用命令 配置 全局配置 共享库配置 用户名密码认证库配置 Samba 登录用户配置 防火墙配置 设定安全的上下文关系 本地系统设置访问读写权限 Pdbedit ...
- AcWing 368. 银河
原本是一个差分约束的问题,但是由于数据过大可能导致\(spfa\)被卡,而由于这道题的边权只有\(0,1\)两种,比较特殊,所以使用\(tarjan\)求连通分量,缩点,递推的方式也能完成,时间复杂度 ...
- 毕业论文精选:基于Qt的高考志愿系统填报查询的设计与实现
基于Qt的高考志愿系统填报查询的设计与实现 摘 要 在当今社会教育的迅速发展下,高考人数的规模和增长速度也是空前的.高考已经变成了家长和社会高度关注的事情,但是高考只是一个开始,高考结束后的志 ...
- IDEA提示java_ 程序包org.apache.ibatis.session不存在
一.解决方案 1.问题原因: 这是因为配置Java的程序包这块出现了错误,同时可能你还没有设置让IDEA自动加载Jar包,才会报出这种错误的. 2.解决方案: 解决方式如下: File->Set ...
- springboot整合kafka,收不到消息,日志输出dead for group解决方法
项目启动以后收不到Kafka发出的消息,日志输出类似: INFO [org.springframework.kafka.KafkaListenerEndpointContainer#1-7-C-1] ...
- [ARC132E] Paw
题目链接 考虑最后形态,一定是有某一个区间 \([l,r]\) 保持初始的样子, \(l\) 前面都是 <,\(r\) 后面都是 >. 这个区间一定是某两个相邻圆点的位置.设 \(f_i\ ...