第⼆章第⼆节px4的uORB⼯作原理分析闫刚
获得快乐
px4中的uorb是px4⾮常核⼼的数据通信机制,所有线程的通信都是靠uorb完成,⽤过的⼈可能,仅仅知道在想要获取orb数据的时候,先进⾏订阅,在发送orb消息之前,先公告主题,uorb是如何⼯作的?可能少于⼈知道。直接上代码!!
使⽤⽅法
1.发送orb消息: 【orb_adverti订阅】 【orb_publisb发布】
2. 获取orb消息 【orb_subscribe订阅】 【orb_check检测】【orb_copy提取】
单元测试代码中华经典故事
1. 代码架构
文明礼貌作文
2. 编译代码调试代码
我们把这个⽂件放到nuttx_ake中,px4默认的已经把uorb_tests的单元测试已经放到nuttx_px4fmu-
ake中,已经构建完成, 这个就是uorb_test就是px4⾃⼰写的uorb单元测试代码,px4的各个模块的代码都会有⾃⼰单元测试代码,这个是⾮常好的让我们理解模块设计者的思想。 下⾯我们编译下载,px4⼯程,同时进⼊nsh控制台输⼊uorb_tests可以看到下⾯的输出信息。
3. 查看设备树
我们会发现设备树下出现了很多的orb消息的节点,节点是如何⽣成的
4. 分析代码,找到线程⼊⼝函数uorb_tests_main, 进⼊t.test()⽅法
代码分析
追踪orb公告和订阅的函数,我们可以发现这个,他们最终都调⽤了node_open的函数,区别在公告的时候传递参数advertir 是true, 在订阅的时候advertir是fla,
域名函数当我们知道最核⼼的代码是node_open的时候,我们查看node_open的实现⽅法
int uORB::Manager::node_open
(
Flavor f,
const struct orb_metadata *meta,
办公用品采购流程const void *data,
朦的组词
bool advertir,
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 adverti/subscribe such a thing.
*/
if (nullptr == meta) {
errno = ENOENT;
return ERROR;
}
/*
* Advertir must publish an initial value.
*/
if (advertir && (data == nullptr)) {
errno = EINVAL;
return ERROR;
}
/* if we have an instance and are an advertir, we will generate a new node and t the instance, * so we do not need to open here */
if (!instance || !advertir) {
/*
跳皮筋图片* 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 advertir or the subscriber */
fd = px4_open(path, advertir ? PX4_F_WRONLY : PX4_F_RDONLY);
} el {
*instance = 0;
}
/* we may need to adverti */
这个代码也很长,我们分析这个代码
1. ⾸先在公告的时候,会创建路径
ret = uORB::Utils::node_mkpath(path, f, meta, instance);
2. 打开这个路径,作为⽂件句柄
fd = px4_open(path, advertir ? PX4_F_WRONLY : PX4_F_RDONLY);
注意:从"advertir ?PX4_F_WRONLY : PX4_F_RDONLY"这⾥我们orb最重要的思想是,订阅仅仅是读,发布仅仅是写。
3. 可能很多⼈都知道,orb的主题的订阅和公告是分开,也就是说没有线程公告主题,订阅也会成功,这是如何实现?
if (fd < 0) {
/* try to create the node */
ret = node_adverti(meta, instance, priority);
从这⾥就可以看出,订阅的时候,打开路径失败,就是公告主题,也就是这个原因,让orb不会限制线程的启动顺序导致orb订阅失败.