/**************************************************************************** * * Copyright (c) 2012-2019 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name PX4 nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************/
将下面的代码复制到头部注释的下方, 该注释应出现在所有贡献的文件中!
/** * @file px4_simple_app.c * Minimal application example for PX4 autopilot * * @author Example User <mail@example.com> */#include<px4_platform_common/log.h>__EXPORT intpx4_simple_app_main(int argc,char*argv[]);intpx4_simple_app_main(int argc,char*argv[]){PX4_INFO("Hello Sky!");return OK;}
############################################################################## Copyright (c) 2015 PX4 Development Team. All rights reserved.## Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions# are met:## 1. Redistributions of source code must retain the above copyright# notice, this list of conditions and the following disclaimer.# 2. Redistributions in binary form must reproduce the above copyright# notice, this list of conditions and the following disclaimer in# the documentation and/or other materials provided with the# distribution.# 3. Neither the name PX4 nor the names of its contributors may be# used to endorse or promote products derived from this software# without specific prior written permission.## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE# POSSIBILITY OF SUCH DAMAGE.#############################################################################px4_add_module( MODULE examples__px4_simple_app MAIN px4_simple_app STACK_MAIN 2000 SRCS px4_simple_app.c DEPENDS )
nsh> help
help usage: help [-v] [<cmd>]
[ df kill mkfifo ps sleep
? echo losetup mkrd pwd test
cat exec ls mh rm umount
cd exit mb mount rmdir unset
cp free mkdir mv set usleep
dd help mkfatfs mw sh xd
Builtin Apps:
reboot
perf
top
..
px4_simple_app
..
sercon
serdis
sensor_sub_fd是一个主题句柄,它可以用于非常有效地执行阻塞等待新数据。 当前线程进入休眠状态,一旦有新数据可用就会被调度器自动唤醒,等待时不消耗任何 CPU 周期。 为此,我们使用poll() POSIX 系统调用。
添加poll()到订阅看起来像(伪代码,在下面可查找完整的实现):
#include<poll.h>#include<uORB/topics/sensor_combined.h>..int sensor_sub_fd =orb_subscribe(ORB_ID(sensor_combined));/* one could wait for multiple topics with this technique, just using one here */px4_pollfd_struct_t fds[] = { { .fd = sensor_sub_fd, .events = POLLIN },};while (true) { /* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */int poll_ret =px4_poll(fds,1,1000); ..if (fds[0].revents & POLLIN) { /* obtained data for the first file descriptor */structsensor_combined_sraw; /* copy sensors raw data into local buffer */orb_copy(ORB_ID(sensor_combined), sensor_sub_fd,&raw);PX4_INFO("Accelerometer:\t%8.4f\t%8.4f\t%8.4f", (double)raw.accelerometer_m_s2[0], (double)raw.accelerometer_m_s2[1], (double)raw.accelerometer_m_s2[2]); }}
/**************************************************************************** * * Copyright (c) 2012-2019 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. Neither the name PX4 nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************//** * @file px4_simple_app.c * Minimal application example for PX4 autopilot * * @author Example User <mail@example.com> */#include<px4_platform_common/px4_config.h>#include<px4_platform_common/tasks.h>#include<px4_platform_common/posix.h>#include<unistd.h>#include<stdio.h>#include<poll.h>#include<string.h>#include<math.h>#include<uORB/uORB.h>#include<uORB/topics/sensor_combined.h>#include<uORB/topics/vehicle_attitude.h>__EXPORT intpx4_simple_app_main(int argc,char*argv[]);intpx4_simple_app_main(int argc,char*argv[]){PX4_INFO("Hello Sky!"); /* subscribe to sensor_combined topic */int sensor_sub_fd =orb_subscribe(ORB_ID(sensor_combined)); /* limit the update rate to 5 Hz */orb_set_interval(sensor_sub_fd,200); /* advertise attitude topic */struct vehicle_attitude_s att;memset(&att,0,sizeof(att));orb_advert_t att_pub =orb_advertise(ORB_ID(vehicle_attitude),&att); /* one could wait for multiple topics with this technique, just using one here */px4_pollfd_struct_t fds[]= { { .fd = sensor_sub_fd, .events = POLLIN }, /* there could be more file descriptors here, in the form like: * { .fd = other_sub_fd, .events = POLLIN }, */ };int error_counter =0;for (int i =0; i <5; i++) { /* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */int poll_ret =px4_poll(fds,1,1000); /* handle the poll result */if (poll_ret ==0) { /* this means none of our providers is giving us data */PX4_ERR("Got no data within a second"); } elseif (poll_ret <0) { /* this is seriously bad - should be an emergency */if (error_counter <10|| error_counter %50==0) { /* use a counter to prevent flooding (and slowing us down) */PX4_ERR("ERROR return value from poll(): %d", poll_ret); } error_counter++; } else {if (fds[0].revents & POLLIN) { /* obtained data for the first file descriptor */struct sensor_combined_s raw; /* copy sensors raw data into local buffer */orb_copy(ORB_ID(sensor_combined), sensor_sub_fd,&raw);PX4_INFO("Accelerometer:\t%8.4f\t%8.4f\t%8.4f", (double)raw.accelerometer_m_s2[0], (double)raw.accelerometer_m_s2[1], (double)raw.accelerometer_m_s2[2]); /* set att and publish this information for other apps the following does not have any meaning, it's just an example */att.q[0] =raw.accelerometer_m_s2[0];att.q[1] =raw.accelerometer_m_s2[1];att.q[2] =raw.accelerometer_m_s2[2];orb_publish(ORB_ID(vehicle_attitude), att_pub,&att); } /* there could be more file descriptors here, in the form like: * if (fds[1..n].revents & POLLIN) {} */ } }PX4_INFO("exiting");return0;}