From c889ec1cdc00a55e1df0eaae28af3f979362a949 Mon Sep 17 00:00:00 2001 From: zhangxiaowei16 Date: Wed, 22 Oct 2025 17:13:29 +0800 Subject: [PATCH] Sensor Framework Guide --- .../peripheral_driver/sensor/figures/001.png | Bin 0 -> 44627 bytes .../sensor/sensor_framework_guide.md | 69 ++++++++++++++++++ .../peripheral_driver/sensor/figures/001.png | Bin 0 -> 44627 bytes .../sensor/sensor_framework_guide.md | 69 ++++++++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 en/device_dev_guide/driver/peripheral_driver/sensor/figures/001.png create mode 100644 en/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md create mode 100644 zh-cn/device_dev_guide/driver/peripheral_driver/sensor/figures/001.png create mode 100644 zh-cn/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md diff --git a/en/device_dev_guide/driver/peripheral_driver/sensor/figures/001.png b/en/device_dev_guide/driver/peripheral_driver/sensor/figures/001.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6ad565d9edf5f654ec46aa1c29bcc6aecb7e8d GIT binary patch literal 44627 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%0D`;LS{Ptany`q1#c z*RE}=RK`H1p9&6=s$iC!0$mjrOY9*}dFI@_I_SyyS@%lbigvW11lJqz2$Jd=D@lV- zsLAG27oF@I*9n+6js0{|t6!#mQ$^OeO`Hahi2-_%AOasdNx>X_Dy~qIAR@^7S~F4| zI8!JI!9Zu8Sgd)7c5#aS827I1fem+B=|gdqeO2=bVAIO(6?`HGVN4Y(^)cl;Q(%+~ zGnhaRPP}F@3GO|iz4y1Q#&=k1Z_=f{RJy+_)S`bSx2o^h=t$03i{Y8+x5d2?(BR__Z9`UcrZdcE z=qg&eQc8AO2lig5$7?{lLOj|3vk$lu=9OiATPyA5_rYZ+!8Qn&FD!LEigORPdX4H zkZ7Tb8R@MmC#O6(jOKeg)#tj|WU4dctfwjBC+iW#kIEb*8n-Py4l>wn`y%K`kb0BK zY}dJ!WXJPG)~1FbW#SyO!T|!1Pe*`o*Xiu^YWtRkb<(~h?jF?p?g&M>8e*s>(;74| z{j68R*ZRzy1ZEDEloRQts%?qat+pwS%;?y%wNo59igx3???6%o%`#TJf(Qc>H4f`KCg4dM#O0CPY4VKp2!3xc3BUp<&HaWzP#DCn%?z>B{UU zTd}OD3UInC_A`e!6~)h^yuIf`BoB#H*&p^IzY(m~5z|hNi`1LHbUTnUxyvE&Fkc7{ zk8DO&N&aCoxIXPJ&!iy*%T9DCJv#I?m`bCXH6(NS2IH8jwjpqH=6HtXEaXlf?ftR@ zO}-}VA{{N_MU{Dog_7{9UH@*(FzN6?LkJ=gsacb_YT@?2PlDaZinjG~Vfp4Mz3 zZnHRQyi39UW~xsyDmlQiz>?4PATR{Mrm)`3v|PR3kVS)tI83j?UT@O5yh#?-KsGF{ zG3+cj5qLL+Xx?jdQ{Rnhsc;Zd+A+>`JX8NgIgns|cC2qHp53U0Py9t&v+Ydcg4o(*iRXkbZh@SRH=Z6>b*q}+`lKqZivJPRNY|`a&AgPwZ068 zBm*IK`}7Y+TEtQa3l18cX8+Mr!K5JB^%*DiQYIL^i(;^RMZq2yvTfqim~JTAZQstm zusi@fE=z0Sm!%JXYK_$ICXUx&HYUcz5Tzk~8mH7PT(^O;u&nkIwp*dzcU_sLK5b&Z zW6}L?FDB<1ml%C$95sR+aq%oZYLITXU=9S|)*J(tv)jCl!`%fwRLIuC{jrYgqw);G z_H%h2pmia!;j1Cp{SbQl0Q7~iIaDqs-#t@h*Pa_XY&Xt1#6#!%d?MvdwTx;pZ5-hS z+Q2G2xYelaW##+<6CWeeLaWE%X9f*^dj^1_*SLGe8WO{cTfn>8QX?^U`J3Ut3{jEa z;iH=KAsx3iSwXPCD)`{=1$Iy8CRs6 z0$I#nr%q#(E{~&|Wsh`w6Th?)3*QuZ#DKX6ToD;P%J+9o5^t~vxdz@skwq4~H@9b< zZ6fxLOKyzjX3rW<_VlKA3+VN zuS@cRKi_D4=ltP*$%>%9Rw=BomZzTimPjh&C~5m{n&320)=GR_;;0=N#L$AJ@LwIR z8>0@4lq{ezC1y$m7#-5kHcVeeh*s>Nog9jU=ah7zh>4isB- z)`mV?B;5p@I_Z{z7kDX$%g6pK|0g*49M}wck;+y2OWjhd>3`;zhF6e~jhLz*ck&u=AB zW&JOscIQB&jWTYl)51xt%M9{7?7#RlZGPV;aaKNVR4e@J-x8^EWPb(DIr!)uDn$V? z!9ZA;=x4F%CKtLcO86i}eZ{Ow-if1Q8A;Mv1 zuyj`fD7iZlqX%4TBR?q$%Od|6v(6pJYB=slT|bOFb73n6u-3>?YJ}4fN*Y)ZHf4#e zJe+gVq>2wFnf$D(9=mSPr6T;4+MMMW6aoqvtyQ#Md=<|MfSF|o5&NiGAD4Evy;#3q zlM~AGfu}#kLMYTMe~%IvrzjBsPQrnA6%*8~CV>j|K-2a3KTUz$Zz0#KM>Zl>ln@r5i?=@)$T=B+ z zPv75QDkO1*5|?{62u;%Z&Rk_{b-@8h$hY+4MBUAKRP&T$KQZCz>ALo})uU;Hfm2*S z3q}HU{>tRdJZSZ3!;tQVp@*6AiLMo5@6;Gx+EKpb!=gfi*w(>N%|ZqnAl`?<3&!4Q zEo+K9f=+10oPQRN@#Xmrt_tHGoEYamxLsSDmTP^6kHtI!jg?c~WAd`oYf9>$JCv7y zeL4_}nYdNa1HKfk8h8gSmf-GoQZ6pFeytIeb-^+y6(1aLkwA_{X8Rexp|ec2q?pi6 z67_G^InKl)Y)z*m=`L1zp7+lxt9Rj#hIQ~;k&8gbYko3du;Y(brhVSBpZob{KL1W_ z_T6w&e5KVg%TDU>>AnEPNcd(=F}DJC>d_z{v(gjyREb{PZbSBS)eY|3>?IAjRQV(C zeSlav;FX_fhIxsGpey-LKF>bM4fHue8-Gqd(u20GtwVoL{p&wdr$V6F>s^<3p0~U^ z!yIVe$R=Egjux!2g@wT}8zT*X+$1k})l;17)TA%5+mePitkRG4MxyY;a&F;&lH_l|}Cy4ALv)ErW$g zk`6R8!9=6LA$%v+GGA9sSo*P3xm(T1*1g^X03(!iBfnUnYd%ZqhmD<7Uuk6mi!BUM zg3Qkt@=l_+o?2@GAdA-MAzH_JQ^wtHiJ^I8Hft=rGd15fXXjXe2L@INC6}%K-qB@a z6}-#G0v?P2_X+#Y%=mDzFnx22uTS{enI zh^AuX4mNVler?j(l(9KNu(Tic`G~!b-fKDZsb%;s=yy{9S!Yp3~0` zj~!S5i%~q52{YAZ=uS~f`wjlZ0rILXzpc%rvbdh*rT5V+oX^SZR3G%#^kb*9wl0_s z3TWjNHH3=^t$1;VujaP^>z#+o|MhTtyFpV|l>c3T?j_={AMK=WSZrzD{={JX@i%l@ zMGpRB!my>2yhXmFjkAS_i}B^|F2GZwpR!;2B%`aol39yM2h@1)#UqG#)tAdydw>nS zeJtjh80vX7|M*);Sw7d14z551?~a@w@ZK>Hbyn(AlliTGd`fFj+K;7ntu}%zX_3l*oy!E#h=oep9BYu{RUcFc3N4+13s$vw3NOon85!7 DB==If literal 0 HcmV?d00001 diff --git a/en/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md b/en/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md new file mode 100644 index 0000000..44a746c --- /dev/null +++ b/en/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md @@ -0,0 +1,69 @@ +# Sensor Framework Guide + +\[ English | [简体中文](../../../../../zh-cn/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md) \] + +## I. Overview + +Sensors are the perceptual core of Internet of Things (IoT) systems, responsible for converting changes in the physical world (such as motion, light, and temperature) into digital signals. To address the growing variety of sensors and the resulting complexity in application development, a unified and efficient software framework is essential. + +## II. Architecture Evolution + +The openvela Sensor framework has evolved from a simple model to a more complex architecture to adapt to changing product requirements. + +### 1. Early Model: Native Character Devices + +The initial sensor driver model in openvela was primarily based on simple character devices. Applications operated sensors by directly accessing `/dev/xxx` device nodes through standard system calls such as `open`, `read`, and `ioctl`. + +The drawback of this model was that it exposed the full complexity of sensor management to the application layer. + +### 2. Sensor Framework 2.0: Layering and Message-Driven Architecture + +With increasing demands for low power consumption, multi-core communication, and standardization, openvela significantly refactored the Sensor framework, leading to the current stable and efficient 2.0 architecture. + +The latest Sensor framework (labeled **Vela Sensor Fw** on the right side of the diagram) is based on two core design principles: **layered decoupling** and a **message-driven** approach. It primarily consists of two components: the **Sensor Driver Stack** and the **uORB Middleware**. + +Sensor Framework 2.0 + +## III. Core Architecture Details + +The latest Vela Sensor software architecture is composed of two main parts: the **Sensor Driver Stack** and the **uORB Middleware**. These components work together to achieve layered decoupling between hardware and applications. + +### 1. Sensor Driver Stack + +The Sensor Driver Stack is responsible for interacting with the physical hardware and providing a unified interface to the upper layers. To facilitate code reuse and separation of concerns, the driver stack is designed with two layers: an **Upper Half** and a **Lower Half**. + +#### Upper Half Driver (Common Layer) + +This layer does not interact directly with hardware. Instead, it provides a common framework and set of services for all sensor drivers. Its main responsibilities include: + +- **Device Node Management**: Automatically creates standardized device nodes, such as `/dev/sensor/accel0`. +- **System Call Interface**: Provides a standard `file_operations` structure to respond to requests from the kernel. +- **Resource Management**: Implements multi-user access control through reference counting. +- **Data Buffering**: Features a built-in, efficient circular buffer to cache sensor events. +- **Advanced Features**: Manages batch mode and provides a unified `ioctl` control interface. + +#### Lower Half Driver (Hardware Adaptation Layer) + +This layer is the actual hardware driver, implemented by **driver developers** for specific sensor chips. Its core responsibilities are: + +- **Hardware Interaction**: Configures and controls the sensor hardware via buses like I2C/SPI. +- **Standard Interface Implementation**: Implements standard callback functions such as `activate` (to enable/disable), `set_interval` (to set the sampling rate), and `batch` (to configure batch processing). +- **Data Acquisition and Reporting**: Fetches data from the hardware via interrupts or polling, encapsulates it into a `sensor_event`, and sends it to the Upper Half's circular buffer. +- **Multi-core Communication Support (Rpmsg Lower Half)**: As a special type of Lower Half, it enables cross-core sensor data communication. A CPU on one core can transparently subscribe to a topic published by another core, and vice versa, providing distributed sensing capabilities for multi-core heterogeneous systems. + +### 2. uORB Middleware + +uORB acts as the crucial bridge between drivers and applications. It employs a publish-subscribe model and implements automatic power management for sensors. + +- **Publish-Subscribe Model**: + + - **Application Layer**: Applications no longer access device nodes directly. Instead, they **subscribe** to sensor topics of interest through the uORB API to receive data. + - **Driver Layer**: During initialization, a sensor driver **advertises** its corresponding topics to uORB. + +- **Automatic Power Management**: + + - uORB monitors the subscription status of all topics. + - When a topic is subscribed to for the **first time**, uORB automatically calls the lower-half driver's `activate` function through the driver framework to **enable** the sensor. + - When the **last subscriber** to a topic unsubscribes, uORB automatically calls the function to **disable** the sensor, thus achieving intelligent and efficient power management. + +To help developers in different roles use the framework efficiently, the following documentation explains the framework from the perspectives of both application developers and driver developers. \ No newline at end of file diff --git a/zh-cn/device_dev_guide/driver/peripheral_driver/sensor/figures/001.png b/zh-cn/device_dev_guide/driver/peripheral_driver/sensor/figures/001.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6ad565d9edf5f654ec46aa1c29bcc6aecb7e8d GIT binary patch literal 44627 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%0D`;LS{Ptany`q1#c z*RE}=RK`H1p9&6=s$iC!0$mjrOY9*}dFI@_I_SyyS@%lbigvW11lJqz2$Jd=D@lV- zsLAG27oF@I*9n+6js0{|t6!#mQ$^OeO`Hahi2-_%AOasdNx>X_Dy~qIAR@^7S~F4| zI8!JI!9Zu8Sgd)7c5#aS827I1fem+B=|gdqeO2=bVAIO(6?`HGVN4Y(^)cl;Q(%+~ zGnhaRPP}F@3GO|iz4y1Q#&=k1Z_=f{RJy+_)S`bSx2o^h=t$03i{Y8+x5d2?(BR__Z9`UcrZdcE z=qg&eQc8AO2lig5$7?{lLOj|3vk$lu=9OiATPyA5_rYZ+!8Qn&FD!LEigORPdX4H zkZ7Tb8R@MmC#O6(jOKeg)#tj|WU4dctfwjBC+iW#kIEb*8n-Py4l>wn`y%K`kb0BK zY}dJ!WXJPG)~1FbW#SyO!T|!1Pe*`o*Xiu^YWtRkb<(~h?jF?p?g&M>8e*s>(;74| z{j68R*ZRzy1ZEDEloRQts%?qat+pwS%;?y%wNo59igx3???6%o%`#TJf(Qc>H4f`KCg4dM#O0CPY4VKp2!3xc3BUp<&HaWzP#DCn%?z>B{UU zTd}OD3UInC_A`e!6~)h^yuIf`BoB#H*&p^IzY(m~5z|hNi`1LHbUTnUxyvE&Fkc7{ zk8DO&N&aCoxIXPJ&!iy*%T9DCJv#I?m`bCXH6(NS2IH8jwjpqH=6HtXEaXlf?ftR@ zO}-}VA{{N_MU{Dog_7{9UH@*(FzN6?LkJ=gsacb_YT@?2PlDaZinjG~Vfp4Mz3 zZnHRQyi39UW~xsyDmlQiz>?4PATR{Mrm)`3v|PR3kVS)tI83j?UT@O5yh#?-KsGF{ zG3+cj5qLL+Xx?jdQ{Rnhsc;Zd+A+>`JX8NgIgns|cC2qHp53U0Py9t&v+Ydcg4o(*iRXkbZh@SRH=Z6>b*q}+`lKqZivJPRNY|`a&AgPwZ068 zBm*IK`}7Y+TEtQa3l18cX8+Mr!K5JB^%*DiQYIL^i(;^RMZq2yvTfqim~JTAZQstm zusi@fE=z0Sm!%JXYK_$ICXUx&HYUcz5Tzk~8mH7PT(^O;u&nkIwp*dzcU_sLK5b&Z zW6}L?FDB<1ml%C$95sR+aq%oZYLITXU=9S|)*J(tv)jCl!`%fwRLIuC{jrYgqw);G z_H%h2pmia!;j1Cp{SbQl0Q7~iIaDqs-#t@h*Pa_XY&Xt1#6#!%d?MvdwTx;pZ5-hS z+Q2G2xYelaW##+<6CWeeLaWE%X9f*^dj^1_*SLGe8WO{cTfn>8QX?^U`J3Ut3{jEa z;iH=KAsx3iSwXPCD)`{=1$Iy8CRs6 z0$I#nr%q#(E{~&|Wsh`w6Th?)3*QuZ#DKX6ToD;P%J+9o5^t~vxdz@skwq4~H@9b< zZ6fxLOKyzjX3rW<_VlKA3+VN zuS@cRKi_D4=ltP*$%>%9Rw=BomZzTimPjh&C~5m{n&320)=GR_;;0=N#L$AJ@LwIR z8>0@4lq{ezC1y$m7#-5kHcVeeh*s>Nog9jU=ah7zh>4isB- z)`mV?B;5p@I_Z{z7kDX$%g6pK|0g*49M}wck;+y2OWjhd>3`;zhF6e~jhLz*ck&u=AB zW&JOscIQB&jWTYl)51xt%M9{7?7#RlZGPV;aaKNVR4e@J-x8^EWPb(DIr!)uDn$V? z!9ZA;=x4F%CKtLcO86i}eZ{Ow-if1Q8A;Mv1 zuyj`fD7iZlqX%4TBR?q$%Od|6v(6pJYB=slT|bOFb73n6u-3>?YJ}4fN*Y)ZHf4#e zJe+gVq>2wFnf$D(9=mSPr6T;4+MMMW6aoqvtyQ#Md=<|MfSF|o5&NiGAD4Evy;#3q zlM~AGfu}#kLMYTMe~%IvrzjBsPQrnA6%*8~CV>j|K-2a3KTUz$Zz0#KM>Zl>ln@r5i?=@)$T=B+ z zPv75QDkO1*5|?{62u;%Z&Rk_{b-@8h$hY+4MBUAKRP&T$KQZCz>ALo})uU;Hfm2*S z3q}HU{>tRdJZSZ3!;tQVp@*6AiLMo5@6;Gx+EKpb!=gfi*w(>N%|ZqnAl`?<3&!4Q zEo+K9f=+10oPQRN@#Xmrt_tHGoEYamxLsSDmTP^6kHtI!jg?c~WAd`oYf9>$JCv7y zeL4_}nYdNa1HKfk8h8gSmf-GoQZ6pFeytIeb-^+y6(1aLkwA_{X8Rexp|ec2q?pi6 z67_G^InKl)Y)z*m=`L1zp7+lxt9Rj#hIQ~;k&8gbYko3du;Y(brhVSBpZob{KL1W_ z_T6w&e5KVg%TDU>>AnEPNcd(=F}DJC>d_z{v(gjyREb{PZbSBS)eY|3>?IAjRQV(C zeSlav;FX_fhIxsGpey-LKF>bM4fHue8-Gqd(u20GtwVoL{p&wdr$V6F>s^<3p0~U^ z!yIVe$R=Egjux!2g@wT}8zT*X+$1k})l;17)TA%5+mePitkRG4MxyY;a&F;&lH_l|}Cy4ALv)ErW$g zk`6R8!9=6LA$%v+GGA9sSo*P3xm(T1*1g^X03(!iBfnUnYd%ZqhmD<7Uuk6mi!BUM zg3Qkt@=l_+o?2@GAdA-MAzH_JQ^wtHiJ^I8Hft=rGd15fXXjXe2L@INC6}%K-qB@a z6}-#G0v?P2_X+#Y%=mDzFnx22uTS{enI zh^AuX4mNVler?j(l(9KNu(Tic`G~!b-fKDZsb%;s=yy{9S!Yp3~0` zj~!S5i%~q52{YAZ=uS~f`wjlZ0rILXzpc%rvbdh*rT5V+oX^SZR3G%#^kb*9wl0_s z3TWjNHH3=^t$1;VujaP^>z#+o|MhTtyFpV|l>c3T?j_={AMK=WSZrzD{={JX@i%l@ zMGpRB!my>2yhXmFjkAS_i}B^|F2GZwpR!;2B%`aol39yM2h@1)#UqG#)tAdydw>nS zeJtjh80vX7|M*);Sw7d14z551?~a@w@ZK>Hbyn(AlliTGd`fFj+K;7ntu}%zX_3l*oy!E#h=oep9BYu{RUcFc3N4+13s$vw3NOon85!7 DB==If literal 0 HcmV?d00001 diff --git a/zh-cn/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md b/zh-cn/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md new file mode 100644 index 0000000..213a7e5 --- /dev/null +++ b/zh-cn/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md @@ -0,0 +1,69 @@ +# Sensor 框架指南 + +\[ [English](../../../../../en/device_dev_guide/driver/peripheral_driver/sensor/sensor_framework_guide.md) | 简体中文 \] + +## 一、概述 + +传感器(Sensor)是物联网(IoT)系统的感知中枢,负责将物理世界的变化(如运动、光照、温度等)转换为数字信号。为了应对日益增长的传感器种类和由此带来的应用开发复杂性,一个统一、高效的软件框架至关重要。 + +## 二、架构演进 + +openvela Sensor 框架经历了从简单到复杂的演进过程,以适应不断变化的产品需求。 + +### 1、早期模型:原生字符设备 + +openvela 最初的 Sensor 驱动模型以简单交互的字符设备为主。应用程序通过标准的系统调用(`open`, `read`, `ioctl`)直接访问 `/dev/xxx` 设备节点来操作传感器。 + +这种模型的缺点在于将传感器管理的复杂性完全暴露给了上层应用。 + +### 2、Sensor 框架 2.0:分层与消息驱动 + +随着对低功耗、多核通信和标准化需求的提升,openvela 对 Sensor 框架进行了重大重构,形成了当前稳定、高效的 2.0 架构。 + +最新的 Sensor 框架(图右侧 **Vela Sensor Fw**)基于两大核心设计原则:**分层解耦**和**消息驱动**。它主要由 **Sensor 驱动栈**和 **uORB 中间件**两部分构成。 + +Sensor Framework 2.0 + +## 三、核心架构详解 + +最新的 Vela Sensor 软件架构主要由 **Sensor 驱动栈 (Driver Stack)** 和 **uORB 中间件 (Middleware)** 两部分组成,二者协同工作,实现了硬件与应用之间的分层解耦。 + +### 1、Sensor 驱动栈 (Driver Stack) + +Sensor 驱动栈负责与物理硬件交互,并为上层提供统一的接口。为实现代码复用和逻辑分离,驱动栈被设计为 **Upper Half** 和 **Lower Half** 两层。 + +#### Upper Half Driver (通用层) + +该层不直接与硬件交互,而是为所有 Sensor 驱动提供一套通用的框架和服务。其主要职责包括: + +- **设备节点管理**:自动创建标准化的设备节点,如 `/dev/sensor/accel0`。 +- **系统调用接口**:提供标准的 `file_operations` 集合,响应来自内核的请求。 +- **资源管理**:通过引用计数实现多用户访问控制。 +- **数据缓冲**:内置高效的环形缓冲区(Circular Buffer),用于缓存传感器事件。 +- **高级功能**:管理 Batch 模式,并提供统一的 `ioctl` 控制接口。 + +#### Lower Half Driver (硬件适配层) + +该层是真正的硬件驱动程序,由**驱动开发者**根据具体的传感器芯片实现。其核心职责是: + +- **硬件交互**:通过 I2C/SPI 等总线配置和控制传感器硬件。 +- **实现标准接口**:实现 `activate` (激活/去激活)、`set_interval` (设置采样率)、`batch` (配置批处理) 等标准回调函数。 +- **数据采集与上报**:通过中断或轮询方式从硬件获取数据,并将其封装成 `sensor_event`,送入 Upper Half 的环形缓冲区。 +- **多核通信支持 (Rpmsg Lower Half)**:作为一种特殊的 Lower Half,它实现了跨核的传感器数据通信。一个核心上的 CPU 可以透明地订阅另一个核心发布的 Topic,反之亦然,为多核异构系统提供了分布式传感能力。 + +### 2、uORB 中间件 (Middleware) + +uORB 是连接驱动与应用的关键桥梁,它采用发布/订阅模型,并实现了对传感器的自动功耗管理。 + +- **发布/订阅模型**: + + - **应用层**: 应用程序不再直接访问设备节点,而是通过 uORB 提供的 API **订阅 (Subscribe)** 感兴趣的传感器主题 (Topic) 来获取数据。 + - **驱动层**: Sensor 驱动在初始化时,向 uORB **发布 (Advertise)** 相应的主题。 + +- **自动功耗管理**: + + - uORB 监控所有 Topic 的订阅状态。 + - 当一个 Topic **首次**被订阅时,uORB 会自动通过驱动框架调用底层驱动的 `activate` 函数来**开启**传感器。 + - 当一个 Topic 的**最后一个订阅者**取消订阅时,uORB 会自动调用 `activate` 函数**关闭**传感器,从而实现智能、高效的功耗管理。 + +为了帮助不同角色的开发人员高效地使用该框架,下面将分别从应用开发者和驱动开发者的视角进行阐述。