前面主要给出uORB消息API接口和自定义消息的使用。这里主要来看下uORB消息管理模块是如何对uORB消息进行管理的。
鉴于Nuttx系统有两种构建模式:不同构建模式使用的源文件也有差异。
参考CMakeLists.txt主要差异在于:
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()
uorb_status
├──> [Flat Build]
│ ├──>
│ │ └──> g_dev->printStatistics();
│ └──> PX4_INFO("uorb is not running");
└──> [Protected Build]
└──> boardctl(ORBIOCDEVMASTERCMD, ORB_DEVMASTER_STATUS);
uorb_top
├──> [Flat Build]
│ ├──>
│ │ └──> g_dev->showTop(topic_filter, num_filters);
│ └──>
│ └──> PX4_INFO("uorb is not running");
└──> [Protected Build]
└──> boardctl(ORBIOCDEVMASTERCMD, ORB_DEVMASTER_TOP);
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;
uORB::Manager::initialize
├──> <_Instance == nullptr)>
│ └──> _Instance = new uORB::Manager();
├──> [Protected Build]
│ └──> _px4_register_boardct_ioctl(_ORBIOCDEVBASE, orb_ioctl); // boardctl
└──> return _Instance != nullptr;
注:uORB_kernel+uORB两套实现代码。代码差异px4_register_boardct_ioctl。
该函数实际上在PX4系统内部并未使用。
uORB::Manager::terminate
├──> <_Instance != nullptr>
│ ├──> delete _Instance
│ ├──> _Instance = nullptr
│ └──> return true
└──> return false
注:uORB_kernel+uORB两套实现代码。代码一致。
注:这里根据uORBManager.hpp列出接口定义(部分在uORBManager.cpp实现,部分在uORBManagerUsr.cpp实现),这里不做代码展开。
uORB::Manager::orb_advertise_multi
注:orb_advertise是orb_advertise_multi的精简版本API
uORB::Manager::orb_unadvertise
uORB::Manager::orb_publish
uORB::Manager::orb_subscribe
uORB::Manager::orb_subscribe_multi
uORB::Manager::orb_unsubscribe
uORB::Manager::orb_set_interval
uORB::Manager::orb_get_interval
uORB::Manager::orb_copy
uORB::Manager::orb_check
uORB::Manager::orb_exists
注:这里根据uORBManager.hpp列出接口定义(部分在uORBManager.cpp实现,部分在uORBManagerUsr.cpp实现),这里不做代码展开。
uORB::Manager::orb_device_node_exists
uORB::Manager::orb_add_internal_subscriber
uORB::Manager::orb_remove_internal_subscriber
uORB::Manager::orb_get_queue_size
uORB::Manager::orb_data_copy
uORB::Manager::register_callback
uORB::Manager::unregister_callback
uORB::Manager::orb_get_instance
uORB::Manager::updates_available
uORB::Manager::is_advertised
Subscription
└──> SubscriptionData
SubscriptionMultiArray
SubscriptionInterval, ListNode
└──> SubscriptionCallback
├──> SubscriptionCallbackWorkItem
└──> SubscriptionBlocking
PublicationBase
├──> Publication
│ └──> PublicationData
└──> PublicationMulti
└──> PublicationMultiData
【1】PX4开源软件框架简明简介
【2】PX4模块设计之二:uORB消息代理
【3】PX4模块设计之三:自定义uORB消息