uORB笔记整理

其实是对自己看过的文章中讲uORB的部分进行了记录。


uORB(Micro Object Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPSPPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」IPC通讯模块。在Pixhawk中,所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。

 

uORB对于NuttX而言,它仅仅是一个普通的文件设备对象,这个设备支持Open、Close、Read、Write、Ioctl以及Poll机制。通过这些接口的实现,uORB提供了一套“点对多”的跨进程广播通讯机制,“点”指的是通讯消息的“源”,“多”指的是一个源可以有多个用户来接收、处理。而“源”与“用户”的关系在于,源不需要去考虑用户是否可以收到某条被广播的消息或什么时候收到这条消息。它只需要单纯的把要广播的数据推送到uORB的消息“总线”上。对于用户而言,源推送了多少次的消息也不重要,重要的是取回最新的这条消息。

 

uORB实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。

(Rhine的猜测:以获取传感器数据为例,设备文件本身不储存数据,但是写有获取的何种传感器数据的说明,发布传感器数据的进程,如“传感器运行进程”,会把传感器数据的说明写入配置文件,而获取传感器数据的进程,如px4_simple_app,会打开读取这个配置文件了解到能获取的传感器数据的相关信息,并不是数据本身)

Pixhawk使用的是NuttX实时ARM系统,uORB实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。进程通过命名的「总线」交换的消息称之为「主题」(topic),在Pixhawk 中,一个主题仅包含一种消息类型,通俗点就是数据类型。每个进程可以「订阅」或者「发布」主题,可以存在多个发布者,或者一个进程可以订阅多个主题,但是一条总线上始终只有一条消息

发布与订阅的过程

0、int poll(structpollfd fds[], nfds_t nfds, int timeout)

功能:监控文件描述符(多个);

说明:timemout=0,poll()函数立即返回而不阻塞;timeout=INFTIM(-1),poll()会一直阻塞下去,直到检测到return> 0;

poll()函数用于监测多个等待事件,若事件未发生,进程睡眠,放弃CPU控制权。若监测的任何一个事件发生,poll函数将唤醒睡眠的进程,并判断是什么等待事件发生,并执行相应的操作。poll( )函数退出后,struct polldf变量的所有值被清零,需要重新设置。

Publisher:

1、orb_advert_torb_advertise(const struct orb_metadata *meta, const void *data)

功能:公告发布者的主题;

orb_advertise 其实就是一个int,  meta是一个已定义好的源描述信息,里面就2个成员,分别为name以及size。保存了通讯的名称以及每次发送数据的长度。 创建源的过程为3个步骤, 打开uORB的设备节点, 获取设备实例, 推送第一条消息。

公告也可以发布初始化数据到主题,meta参数是传递给API的一个指针,指向由ORB_DEFINE()宏定义好的数据,通常使用ORB_ID()宏来根据主题名称获取该指针。请注意,虽然主题更新可以从中断处理函数发布,公告主题必须在常规的线程上下文中执行。

5、intorb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void*data)

功能:发布新数据到主题;

Subscriber:

2、intorb_subscribe(const struct orb_metadata *meta)

功能:订阅主题(topic);

4、int orb_copy(conststruct orb_metadata *meta, int handle, void *buffer)

功能:从订阅的主题中获取数据并将数据保存到buffer中;

3、int orb_check(int handle,bool *updated)

功能:订阅者可以用来检查一个主题在发布者上一次更新数据后,有没有订阅者调用过ob_copy来接收、处理过;

说明:如果主题在在被公告前就有人订阅,那么这个API将返回“not-updated”直到主题被公告。可以不用poll,只用这个函数实现数据的获取。

 

注意:

1、对应uORB的话题发布者,两件事:公告(advertise)、发布(publish);对于话题接收者,三件事:订阅(subscribe)、查询(poll阻塞式等待或check更新)、复制(copy)

2、必须有了orb_advertise( )函数和orb_subscribe()函数(通过它们可以获取orb_copy( )函数中的参数handle句柄)之后才可以使用orb_copy( )函数来获取订阅的主题数据。

3、源码中常用的调用顺序为:orb_subscribe( ) - > orb_check( ) -> orb_copy( )



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值