uORB实际上是一种设计模式中的观察者模式,用于实现一种一对多的依赖关系,让多个观察者(Observer)同时监听某一主题对象(Subject)。当这个主题对象(Subject)的状态发生变化时,会通知观察者对象(Observer),让他们能够自动更新自己。
利用uORB实现数据在不同进程中的通信主要包括三个部分,分别是公告数据(orb_advertise函数)、发布数据(orb_publish函数)以及订阅接收收据(orb_copy函数)。
在下面讲解示范的例程功能是在一个线程任务中获取系统运行的时间戳并公告和发布出去,在另外的一个线程任务中将这个数据读取出来,并打印。程序包含两个C文件,分别是:ReceiveData.C(位于ReceiveData_uORB文件下)和SendData.C(位于SendData_uORB文件下)。
1.首先描述SendData.C文件中的函数功能。SendData.C中包含两个函数。分别是用于创建数据发布线程任务的 SendData_app_main函数和线程任务函数 SendData_thread_main函数。在SendData_app_main函数中利用task_spawn函数完成对线程任务的创建,线程任务创建完成后可以利用Tera Term控制台输入SendData_app_main START或SendData_app_main STOP指令来控制线程任务的起始和停止。在Tera Term控制台内以可以输入PS来查看当前运行中的任务。
在SendData_thread_main函数的功能是完成时间戳数据的公告和发布,是任务的核心内容。对于所要发布的信息首先要在src/modules/uORB/topic中添加发布数据的声明文件,例如本例中添加的文件为datatrans_testvalue.h,内部包括的声明有发布主题的结构体的声明struct datatrans_testvalue_s和对发布主题的声明ORB_DECLARE(datatrans_testvalue),内部还包括如下的头文件引用:
#ifndef TOPIC_DATATRANS_TESTVALUE_H_(需要根据发布的主题进行对应的名称修改)
#define