码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • PX4模块设计之二十一:uORB消息管理模块


    PX4模块设计之二十一:uORB消息管理模块

    • 1. uORB模块构建模式
    • 2. uORB消息管理函数
    • 2.1 状态查询
    • 2.2 资源利用
    • 2.3 模块启动
    • 2.4 模块停止
    • 3. uORB消息接口
      • 3.1 消息主题注册
      • 3.2 消息主题去注册
      • 3.3 消息主题发布
      • 3.4 消息主题订阅
      • 3.5 消息主题去订阅
      • 3.6 设置/获取间隔时间
      • 3.7 获取订阅消息
      • 3.8 主题消费检查
      • 3.9 主题存在性检查
    • 4. uORB消息辅助接口
      • 4.1 设备节点存在性检查
      • 4.2 消息主题内部订阅
      • 4.3 消息主题内部去订阅
      • 4.4 获取队列长度
      • 4.5 获取ORB数据
      • 4.6 设备节点注册回调
      • 4.7 设备节点去注册回调
      • 4.8 获取ORB实例
      • 4.9 主题消息更新检查
      • 4.10 主题注册检查
    • 5. uORB类继承关系
    • 6. 参考资料

    前面主要给出uORB消息API接口和自定义消息的使用。这里主要来看下uORB消息管理模块是如何对uORB消息进行管理的。

    1. uORB模块构建模式

    鉴于Nuttx系统有两种构建模式:不同构建模式使用的源文件也有差异。

    • Flat Build
      uORB:${SRCS_COMMON} + ${SRCS_KERNEL}
    • Protected Build
      uORB_kernel:${SRCS_COMMON} + S R C S K E R N E L = = > 内核态 u O R B : {SRCS_KERNEL} ==> 内核态 uORB: SRCSK​ERNEL==>内核态uORB:{SRCS_COMMON} + ${SRCS_USER} ==> 用户态

    参考CMakeLists.txt主要差异在于:

    1. 总体声明定义:${SRCS_COMMON}下的uORBManager.hpp
    2. 内核态实现: ${SRCS_KERNEL}下的uORBDeviceMaster.cpp、uORBDeviceNode.cpp、uORBManager.cpp
    3. 用户态实现: ${SRCS_USER} 下的uORBManagerUsr.cpp
    4. Flat编译模式:鉴于全地址访问,所以不需要使用用户态实现
    39 set(SRCS_COMMON
    40 	ORBSet.hpp
    41 	Publication.hpp
    42 	PublicationMulti.hpp
    43 	Subscription.cpp
    44 	Subscription.hpp
    45 	SubscriptionCallback.hpp
    46 	SubscriptionInterval.hpp
    47 	SubscriptionMultiArray.hpp
    48 	uORB.cpp
    49 	uORB.h
    50 	uORBCommon.hpp
    51 	uORBCommunicator.hpp
    52 	uORBManager.hpp
    53 	uORBUtils.cpp
    54 	uORBUtils.hpp
    55 	uORBDeviceMaster.hpp
    56 	uORBDeviceNode.hpp
    57 	)
    58 
    59 set(SRCS_KERNEL
    60 	uORBDeviceMaster.cpp
    61 	uORBDeviceNode.cpp
    62 	uORBManager.cpp
    63 	)
    64 
    65 set(SRCS_USER
    66 	uORBManagerUsr.cpp
    67 	)
    68 
    69 if (NOT DEFINED CONFIG_BUILD_FLAT AND "${PX4_PLATFORM}" MATCHES "nuttx")
    70 	# Kernel side library in nuttx kernel/protected build
    71 	px4_add_library(uORB_kernel
    72 		${SRCS_COMMON}
    73 		${SRCS_KERNEL}
    74 		)
    75 	target_link_libraries(uORB_kernel PRIVATE cdev uorb_msgs)
    76 	target_compile_options(uORB_kernel PRIVATE ${MAX_CUSTOM_OPT_LEVEL} -D__KERNEL__)
    77 
    78 	# User side library in nuttx kernel/protected build
    79 	px4_add_library(uORB
    80 		${SRCS_COMMON}
    81 		${SRCS_USER}
    82 		)
    83 else()
    84 
    85 	# Library for all other targets (flat build, posix...)
    86 	px4_add_library(uORB
    87 		${SRCS_COMMON}
    88 		${SRCS_KERNEL}
    89 		)
    90 	target_link_libraries(uORB PRIVATE cdev)
    91 endif()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    2. uORB消息管理函数

    2.1 状态查询

    uorb_status
     ├──> [Flat Build]
     │   ├──> 
     │   │   └──> g_dev->printStatistics();
     │   └──> PX4_INFO("uorb is not running");
     └──> [Protected Build]
         └──> boardctl(ORBIOCDEVMASTERCMD, ORB_DEVMASTER_STATUS);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 资源利用

    uorb_top
     ├──> [Flat Build]
     │   ├──> 
     │   │   └──> g_dev->showTop(topic_filter, num_filters);
     │   └──> 
     │       └──> PX4_INFO("uorb is not running");
     └──> [Protected Build]
         └──> boardctl(ORBIOCDEVMASTERCMD, ORB_DEVMASTER_TOP);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3 模块启动

    uorb_start
     ├──> 
     │   ├──> PX4_WARN("already loaded");
     │   └──> return OK;
     ├──> 
     │   ├──> PX4_ERR("uorb manager alloc failed");
     │   └──> return -ENOMEM;
     ├──> [Flat Build]
     │   ├──> g_dev = uORB::Manager::get_instance()->get_device_master();
     │   └──> 
     │       └──> return -errno;
     └──> return OK;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    uORB::Manager::initialize
     ├──> <_Instance == nullptr)>
     │   └──> _Instance = new uORB::Manager();
     ├──> [Protected Build]
     │   └──> _px4_register_boardct_ioctl(_ORBIOCDEVBASE, orb_ioctl);  // boardctl
     └──> return _Instance != nullptr;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注:uORB_kernel+uORB两套实现代码。代码差异px4_register_boardct_ioctl。

    2.4 模块停止

    该函数实际上在PX4系统内部并未使用。

    uORB::Manager::terminate
     ├──> <_Instance != nullptr>
     │   ├──> delete _Instance
     │   ├──> _Instance = nullptr
     │   └──> return true
     └──> return false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注:uORB_kernel+uORB两套实现代码。代码一致。

    3. uORB消息接口

    注:这里根据uORBManager.hpp列出接口定义(部分在uORBManager.cpp实现,部分在uORBManagerUsr.cpp实现),这里不做代码展开。

    3.1 消息主题注册

    uORB::Manager::orb_advertise_multi
    
    • 1

    注:orb_advertise是orb_advertise_multi的精简版本API

    3.2 消息主题去注册

    uORB::Manager::orb_unadvertise
    
    • 1

    3.3 消息主题发布

    uORB::Manager::orb_publish
    
    • 1

    3.4 消息主题订阅

    uORB::Manager::orb_subscribe
    
    • 1
    uORB::Manager::orb_subscribe_multi
    
    • 1

    3.5 消息主题去订阅

    uORB::Manager::orb_unsubscribe
    
    • 1

    3.6 设置/获取间隔时间

    uORB::Manager::orb_set_interval
    
    • 1
    uORB::Manager::orb_get_interval
    
    • 1

    3.7 获取订阅消息

    uORB::Manager::orb_copy
    
    • 1

    3.8 主题消费检查

    uORB::Manager::orb_check
    
    • 1

    3.9 主题存在性检查

    uORB::Manager::orb_exists
    
    • 1

    4. uORB消息辅助接口

    注:这里根据uORBManager.hpp列出接口定义(部分在uORBManager.cpp实现,部分在uORBManagerUsr.cpp实现),这里不做代码展开。

    4.1 设备节点存在性检查

    uORB::Manager::orb_device_node_exists
    
    • 1

    4.2 消息主题内部订阅

    uORB::Manager::orb_add_internal_subscriber
    
    • 1

    4.3 消息主题内部去订阅

    uORB::Manager::orb_remove_internal_subscriber
    
    • 1

    4.4 获取队列长度

    uORB::Manager::orb_get_queue_size
    
    • 1

    4.5 获取ORB数据

    uORB::Manager::orb_data_copy
    
    • 1

    4.6 设备节点注册回调

    uORB::Manager::register_callback
    
    • 1

    4.7 设备节点去注册回调

    uORB::Manager::unregister_callback
    
    • 1

    4.8 获取ORB实例

    uORB::Manager::orb_get_instance
    
    • 1

    4.9 主题消息更新检查

    uORB::Manager::updates_available
    
    • 1

    4.10 主题注册检查

    uORB::Manager::is_advertised
    
    • 1

    5. uORB类继承关系

    Subscription
     └──> SubscriptionData
    
    
    SubscriptionMultiArray
    
    
    SubscriptionInterval, ListNode
     └──> SubscriptionCallback
         ├──> SubscriptionCallbackWorkItem
         └──> SubscriptionBlocking
    
    PublicationBase
     ├──> Publication
     │   └──> PublicationData
     └──> PublicationMulti
         └──> PublicationMultiData
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    6. 参考资料

    【1】PX4开源软件框架简明简介
    【2】PX4模块设计之二:uORB消息代理
    【3】PX4模块设计之三:自定义uORB消息

  • 相关阅读:
    基于 MybatisPlus 逻辑删除开启情况下兼容多数据库实现批量插入更新通用流程实现
    微服务迁移、重构最佳经验
    spearman相关系数(斯皮尔曼相关系数是什么意思)
    智能运维探索(二) | 如何利用人工智能实现告警关联分析
    微信小程序:装B神器P图修改微信流量主小程序源码下载趣味恶搞图制作免服务器域名
    vue 孙子组件获取祖先组件数据
    从函数计算到 Serverless 架构
    java多线程
    使用阿里云RDS for SQL Server性能洞察优化数据库负载-初识性能洞察
    《动手学深度学习 Pytorch版》 9.2 长短期记忆网络(LSTM)
  • 原文地址:https://blog.csdn.net/lida2003/article/details/126314324
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号