第二章 第二节 px4的uORB工作原理分析 闫刚

2023-05-16


px4中的uorb是px4非常核心的数据通信机制,所有线程的通信都是靠uorb完成,用过的人可能,仅仅知道在想要获取orb数据的时候,先进行订阅,在发送orb消息之前,先公告主题,uorb是如何工作的?可能少于人知道。直接上代码!!

  • 使用方法

1.发送orb消息: 【orb_advertise订阅】 【orb_publisb发布】


2. 获取orb消息 【orb_subscribe订阅】 【orb_check检测】【orb_copy提取】

  •   单元测试代码

  1. 代码架构

  • 2. 编译代码调试代码

我们把这个文件放到nuttx_px4fmu-v2_default.cmake中,px4默认的已经把uorb_tests的单元测试已经放到nuttx_px4fmu-v2_default.cmake中,已经构建完成, 这个就是uorb_test就是px4自己写的uorb单元测试代码,px4的各个模块的代码都会有自己单元测试代码,这个是非常好的让我们理解模块设计者的思想。 下面我们编译下载,px4工程,同时进入nsh控制台输入uorb_tests可以看到下面的输出信息。


3. 查看设备树

我们会发现设备树下出现了很多的orb消息的节点,节点是如何生成的???


4.  分析代码,找到线程入口函数uorb_tests_main, 进入t.test()方法



  •  代码分析

追踪orb公告和订阅的函数,我们可以发现这个,他们最终都调用了node_open的函数,区别在公告的时候传递参数

advertiser 是true, 在订阅的时候advertiser是flase,

函数

当我们知道最核心的代码是node_open的时候,我们查看node_open的实现方法

int uORB::Manager::node_open
(
	Flavor f,
	const struct orb_metadata *meta,
	const void *data,
	bool advertiser,
	int *instance,
	int priority
)
{
	char path[orb_maxpath];
	int fd = -1, ret;

	/*
	 * If meta is null, the object was not defined, i.e. it is not
	 * known to the system.  We can't advertise/subscribe such a thing.
	 */
	if (nullptr == meta) {
		errno = ENOENT;
		return ERROR;
	}

	/*
	 * Advertiser must publish an initial value.
	 */
	if (advertiser && (data == nullptr)) {
		errno = EINVAL;
		return ERROR;
	}

	/* if we have an instance and are an advertiser, we will generate a new node and set the instance,
	 * so we do not need to open here */
	if (!instance || !advertiser) {
		/*
		 * Generate the path to the node and try to open it.
		 */
		ret = uORB::Utils::node_mkpath(path, f, meta, instance);

		if (ret != OK) {
			errno = -ret;
			return ERROR;
		}

		/* open the path as either the advertiser or the subscriber */
		fd = px4_open(path, advertiser ? PX4_F_WRONLY : PX4_F_RDONLY);

	} else {
		*instance = 0;
	}

	/* we may need to advertise the node... */
	

这个代码也很长,我们分析这个代码

1. 首先在公告的时候,会创建路径

ret = uORB::Utils::node_mkpath(path, f, meta, instance);

2. 打开这个路径,作为文件句柄

fd = px4_open(path, advertiser ? PX4_F_WRONLY : PX4_F_RDONLY);

注意:从"advertiser ?PX4_F_WRONLY : PX4_F_RDONLY"这里我们orb最重要的思想是,订阅仅仅是读,发布仅仅是写。

3. 可能很多人都知道,orb的主题的订阅和公告是分开,也就是说没有线程公告主题,订阅也会成功,这是如何实现?

if (fd < 0) {

		/* try to create the node */
		ret = node_advertise(meta, instance, priority);
从这里就可以看出,订阅的时候,打开路径失败,就是公告主题,也就是这个原因,让orb不会限制线程的启动顺序导致orb订阅失败.



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二章 第二节 px4的uORB工作原理分析 闫刚 的相关文章

  • 关于Segmentation fault (core dumped)几个简单问题

    有的程序可以通过编译 xff0c 但在运行时会出现Segment fault 段错误 这通常都是指针错误引起的 但这不像编译错误一样会提示到文件一行 xff0c 而是没有任何信息 一种办法是用gdb的step 一步一步寻找 但要step一个
  • CUDA C 编程指南

    CUDA C Programming Guide CUDA C 编程指南 导读 田子宸 浙大水硕在读 184 人 赞同了该文章
  • 2014华为校招机试高级题——if语法中的括号判断

    http blog csdn net wy4649 article details 11725073 package com huawei job import java util ArrayList import java util Sc
  • MySQL插入数据时报错Cause: java.sql.SQLException: #HY000

    造成这个错误的原因是数据库中有字段要求不能为空 xff0c 但insert语句中没有提供该字段的数据
  • 操作系统经典书籍推荐

    推荐原则 xff1a 宁缺勿滥 xff0c 决不混进糟粕 好书不一定对所有人都合适 xff0c 但对于它的目标读者群来说 xff0c 一定是好书 选书原则 xff1a 有国外的 xff0c 不看国产的 有原版的 xff0c 不看翻译的 看大
  • 英特尔T265 通过Python API获得位置(姿态)数据

    如果你想在树莓派或者jetson nano等嵌入式设备上使用Python API获得T265的数据 xff0c 需要编译pyrealsense2 jetson nano的安装可以参考这篇文章 xff1a jetson nano 编译pyre
  • 英特尔 t265 保存地图 (Python API)

    保存地图 span class token keyword import span pyrealsense2 span class token keyword as span rs span class token keyword impo
  • 车辆控制知识总结(一):LQR算法

    目录 1 LQR简介 2 现代控制理论基础 2 1 状态空间描述 2 2 线性定常系统的状态空间描述框图 2 3 线性系统连续系统的反馈控制 2 31 全状态反馈控制器 3 LQR设计控制器的方法 3 1 什么是二次型 3 3 连续时间下的
  • VMware安装centos 8无法连接外网处理过程

    使用VMware安装centos 8之后发现火狐无法打开百度 xff0c 另外一台ubuntu的虚拟机却可以上百度 对比之后发现问题如下 unbuntu的网卡信息 xff1a centos 8的网卡信息 xff1a 这里很容易发现unbun
  • input输入框、select下拉框在安卓与ios上的兼容性问题

    一 input输入框 在平常做移动端项目时 xff0c 如果不注意的话 xff0c 在ios系统上经常会出现这种问题 xff0c 点击输入框 xff0c 输入框获取焦点 xff0c 此时 苹果手机页面会自动放大 xff0c 而安卓手机不会出
  • WSL2初体验之使用 docker版 Ubuntu 18.04,VNC远程控制

    一 前言 以前用 Oracle VM VirtualBox xff0c 玩 CentOS 7 xff0c 时不时就卡一些 xff0c 而且还不流畅 我喜欢平滑顺畅完美 xff1b 无意中发现了 windows WSL2发布了 xff0c 感
  • 友善串口调试助手

    友善串口调试助手是一款功能十分强大的串口调试工具 xff0c 该软件能够让用户自定义发送文本 保存数据 识别端口等 xff0c 而且还兼容多种Windows系统win10 win7 xp xff0c 能够支持常用的50 256000bps波
  • Struts Action的execute方法不执行问题

    学习了SpringMVC xff0c 又想去探究一下Struts的奥秘 xff0c 是否和SpringMVC有什么异同之处 xff1f 于是 xff0c 动手编写了一个非常简单的demo程序 xff0c 但是在写的过程中 xff0c 发现页
  • JPress开源框架的安装过程 Maven工程导入MyEclipse并运行

    1 点击Jpress下载链接 https github com JpressProjects jpress 下载源码压缩包 xff0c 解压 2 复制解压后的工程到MyEclipse的工作空间中 3 点击MyEclipse gt File
  • Neutron OVS Bridge 连接方式 (veth pair / ovs peer) 的选型和性能测试

    概述 Neutron 的桥的连接从Juno开始使用了ovs peer代替veth pair作为默认的网桥连接方式 xff0c 并宣称有性能方面的提升 xff08 commit xff09 同时在配置文件 xff08 etc neutron
  • JPress安装

    安装完成后数据库中就会生成数据表
  • jQuery LigerUI 使用教程

    首页引入样式文件和js文件 xff1a lt link href 61 34 css ligerui all css 34 rel 61 34 stylesheet 34 type 61 34 text css 34 gt lt jquer
  • 依然迷茫的2016

    2016 xff0c 虽然毕业半年了 xff0c 但自己依然显得稚嫩 xff0c 没有褪去学生时代的幼稚 刚跨完年的我居然马上被骗子盯上了 xff0c 真是非常地不幸 xff0c 俗话说 xff0c 开门红 xff0c 我却倒霉来个开门霉
  • myeclipse部署tomcat问题

    MyEclipse部署tomcat时出现 xff1a Deployment is out of date due to changes in the underlying project contents You 39 ll need to
  • 关于逻辑分区和主分区的困惑

    原文链接 xff1a http www chiphell com thread 556678 1 1 html 问题 xff1a 我新配的机器 xff0c ssd 128g完全用于装系统 xff0c hdd用于存储 xff0c 我是在装完系

随机推荐

  • opencv实现几幅图像拼接成一整幅大图

    开始尝试merge函数 xff0c 具体如下 xff1a 定义四个矩阵A B C D 得到矩阵combine span style font size 18px include lt iostream gt include lt core
  • Python安装时import matplotlib.pyplot as plt报错

    安装matplotlib的时候可能会出现输入import matplotlib pyplot as plt出现报错的现象 xff0c 如下图所示 xff1a gt gt gt import matplotlib gt gt gt impor
  • 回文数和回文素数

    34 回文数 34 是一种数字 如 xff1a 98789 这个数字正读是98789 倒读也是98789 正读倒读一样 xff0c 所以这个数字就是回文数 1千以内 在自然数中 xff0c 最小的回文数是0 xff0c 其次是1 2 3 4
  • pragma pack对齐方式详细介绍

    为了加快读写数据的速度 xff0c 编译器采用数据对齐的方式来为每一个结构体分配空间 写在开头 本文有自己的原创也有转载的博文 xff0c 转载的部分一一列出来 xff0c 可能不全请见谅这里这里这里这里等等 更详细的解说 xff1a 在用
  • Qt学习笔记——打开并显示图片

    使用控件QLabel mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include lt QMainWindow gt include lt QFileDialog gt incl
  • 可调恒流驱动LED电路分析

    https www icxbk com article detail aid 61 884 常规使用的pwm调亮度不仅会导致频闪 xff0c 而且在长时间使用的时候 xff0c 有损坏led的风险 xff0c 所以这次设计了一个恒流调亮度电
  • 如何在雷电模拟器里使用YiLu代理的动态ip?

    1在易路 程序 页面里随意添加一个应用 xff0c 请不要添加 雷电 到YiLu程序里 xff1b 2 YiLu设置 xff1a 点击YiLu 设置 页面 xff1b 选择 YiLu便携代理引擎 xff1b 选择 仅代理YiLu程序选项卡中
  • Freeman链码,差分码,归一化链码,归一化差分码

    Freeman链码是指用曲线起始点的坐标和边界点方向代码来描述曲线或边界的方法 xff0c 常被用来在图像处理 计算机图形学 模式识别等领域中表示曲线和区域边界 它是一种边界的编码表示法 xff0c 用边界方向作为编码依据 xff0c 为简
  • Matlab关联m文件与m文件关联设置

    MATLAB安装后经常出现m文件不能关联到matlab打开 xff0c 很烦恼 网上有一些设置教程 xff0c 比如 xff1a 链接一 按照链接方式一方式二设置后出现报错 修改注册表亦没用 下面链接 链接二 链接三 链接四 都没有效果 代
  • 图像处理形态学椭圆形模板结构元素的设计与实现

    在图像处理中 xff0c 经常要用到形态学操作 xff0c 形态学操作中的结构元素有很多 xff0c 如点结构 十字架结构 圆结构 矩形结构 椭圆形结构等等 本文将介绍椭圆形结构的实现 主要结合OpenCV实现 具体如下 xff1a inc
  • 3维空间旋转3维空间矩阵旋转及旋转变换

    本文将实现三维空间中的旋转和平移变换 xff0c 即将三维空间中的一个向量 或者一个空间图形 移动到另一个位置 如下图所示 xff1a 如上图所示 xff0c 由矢量一移动到矢量二 三维空间中的移动可以分为旋转和平移 设矢量一在坐标位置 X
  • 回归方程推导

  • Mac终端代理设置

    title Mac终端代理设置 tags mac 终端设置代理 打开终端执行 export http proxy 61 http 127 0 0 1 1087 export https proxy 61 http 127 0 0 1 108
  • Unity3D游戏作品大盘点

    原文链接 xff1a http www unitymanual com 404 html 经典重现 新仙剑OL 新仙剑OL 采用跨平台Unity3D引擎 xff0c 耗资数千万 xff0c 历时三年多 xff0c 由台湾大宇正版授权 xff
  • IAR编译器的ICF链接脚本

    测试代码如下 xff1a task c span class token macro property span class token directive keyword pragma span default variable attr
  • 2020-10-24

    PendSV中断控制器地址 NVIC INT CTRL EQU 0xE000Ed04 触发PendSV NVIC PENDSV SET EQU 0x10000000 PendSV优先级控制地址 NVIC SYSPRI2 EQU 0xE000
  • Linux下如何配置Vlan

    VLAN是虚拟局域网的缩写 一个物理交换机上可以共存多个VLAN xff0c 这些交换机通过Linux软件配置 xff0c 而不是通过硬件接口 xff08 您仍然需要配置实际的硬件交换机 xff09 VLAN作为名称建议一次组合多个LAN
  • 附加项-linux下ssh的config文件讲解-闫刚

    在 ssh 下创建 config文件 xff0c 可以添加多个账号 xff0c 减少认证的问题 并以如下格式编辑配置文件 vi config HostName xff1a 是目标主机的主机名 xff0c 也就是平时我们使用ssh后面跟的地址
  • 第一章 第九节 如何Doxygen为代码生成html文档-闫刚

    Doxygen是一款文档生成工具 xff0c 它可以从代码中提取出相应的文档 xff0c 并组织 xff0c 输出成各种漂亮的文档 xff08 如HTML xff0c PDF xff0c RTF等 xff09 doxygen让你变成一位有品
  • 第二章 第二节 px4的uORB工作原理分析 闫刚

    px4中的uorb是px4非常核心的数据通信机制 xff0c 所有线程的通信都是靠uorb完成 xff0c 用过的人可能 xff0c 仅仅知道在想要获取orb数据的时候 xff0c 先进行订阅 xff0c 在发送orb消息之前 xff0c