任务,需要通过后台进程持续的以一定频率,获取uorb某个主题的数据,因此必须通过守护进程的方式,不能中断终端调用其他程序
守护进程可以参考module里面都是用守护进程的方式来跑功能的,关键词task spawn daemon,套一个while循环,来优雅地控制函数功能的开关
获取uorb的方法是,先订阅subscribe再copy,只有这两步骤,中间还有一个poll,这个poll给我造成了巨大的困扰,花了大量心思在理解这个poll上面。所以在记录这里面真正的本质问题前,先写一点关于poll的理解
poll的意思是轮询,poll拿着file descriptor文件描述符,去查看文件描述符是否做好被读取的准备,方法是做一个中断,等待timeout来查询这个消息的状态。poll返回正常,那么你就可以copy,也正常,poll不正常,那你copy应该是拿不到的。
poll如果有什么要注意的,就是poll可以一次喂给他多个文件描述符,同时监控多个文件/主题的情况。poll的作用,就是监控和阻塞timeout(也可以不阻塞)
因此我花了大量的经历去研究poll,但是拿不到数据不是poll的问题,poll的作用只是辅助我拿数据
在示例程序px4_simple_app中,也是一次拿了多次的attitude数据,通过for循环,我改大for循环的循环次数,也是照样可以输出的。因为这里只订阅了一次,for循环只循环copy这个动作
但是在我自己写的那里,while循环内部,每次都是订阅和copy,copy没问题,但是一直订阅,51次之后就报错,说拿不到数据了,这个时候如果输出一下订阅函数的返回值,可能也是有问题的
而且关键是,这在仿真里面没问题,只在板子有问题