mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-08 02:17:07 +08:00
Test latency of publication.
This commit is contained in:
+75
-10
@@ -56,6 +56,7 @@
|
||||
#include <nuttx/arch.h>
|
||||
#include <nuttx/wqueue.h>
|
||||
#include <nuttx/clock.h>
|
||||
#include <systemlib/systemlib.h>
|
||||
|
||||
#include <drivers/drv_hrt.h>
|
||||
|
||||
@@ -682,9 +683,11 @@ namespace
|
||||
{
|
||||
|
||||
ORBDevMaster *g_dev;
|
||||
bool pubsubtest_passed = false;
|
||||
|
||||
struct orb_test {
|
||||
int val;
|
||||
hrt_abstime time;
|
||||
};
|
||||
|
||||
ORB_DEFINE(orb_test, struct orb_test);
|
||||
@@ -718,6 +721,46 @@ test_note(const char *fmt, ...)
|
||||
return OK;
|
||||
}
|
||||
|
||||
int pubsublatency_main(void)
|
||||
{
|
||||
/* poll on test topic and output latency */
|
||||
float latency_integral = 0.0f;
|
||||
|
||||
/* wakeup source(s) */
|
||||
struct pollfd fds[1];
|
||||
|
||||
int test_multi_sub = orb_subscribe_multi(ORB_ID(orb_multitest), 0);
|
||||
|
||||
fds[0].fd = test_multi_sub;
|
||||
fds[0].events = POLLIN;
|
||||
|
||||
struct orb_test t;
|
||||
|
||||
const unsigned maxruns = 10;
|
||||
|
||||
for (unsigned i = 0; i < maxruns; i++) {
|
||||
/* wait for up to 500ms for data */
|
||||
int pret = poll(&fds[0], (sizeof(fds) / sizeof(fds[0])), 500);
|
||||
orb_copy(ORB_ID(orb_multitest), test_multi_sub, &t);
|
||||
|
||||
if (pret < 0) {
|
||||
warn("poll error %d, %d", pret, errno);
|
||||
continue;
|
||||
}
|
||||
|
||||
hrt_abstime elt = hrt_elapsed_time(&t.time);
|
||||
latency_integral += elt;
|
||||
}
|
||||
|
||||
orb_unsubscribe(test_multi_sub);
|
||||
|
||||
warnx("mean: %8.4f", static_cast<double>(latency_integral / maxruns));
|
||||
|
||||
pubsubtest_passed = true;
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
int
|
||||
test()
|
||||
{
|
||||
@@ -779,8 +822,7 @@ test()
|
||||
int instance0;
|
||||
int pfd0 = orb_advertise_multi(ORB_ID(orb_multitest), &t, &instance0, ORB_PRIO_MAX);
|
||||
|
||||
test_note("advertised");
|
||||
usleep(300000);
|
||||
test_note("advertised");
|
||||
|
||||
int instance1;
|
||||
int pfd1 = orb_advertise_multi(ORB_ID(orb_multitest), &t, &instance1, ORB_PRIO_MIN);
|
||||
@@ -795,8 +837,7 @@ test()
|
||||
if (OK != orb_publish(ORB_ID(orb_multitest), pfd0, &t))
|
||||
return test_fail("mult. pub0 fail");
|
||||
|
||||
test_note("published");
|
||||
usleep(300000);
|
||||
test_note("published");
|
||||
|
||||
t.val = 203;
|
||||
if (OK != orb_publish(ORB_ID(orb_multitest), pfd1, &t))
|
||||
@@ -805,19 +846,19 @@ test()
|
||||
/* subscribe to both topics and ensure valid data is received */
|
||||
int sfd0 = orb_subscribe_multi(ORB_ID(orb_multitest), 0);
|
||||
|
||||
if (OK != orb_copy(ORB_ID(orb_multitest), sfd0, &t))
|
||||
if (OK != orb_copy(ORB_ID(orb_multitest), sfd0, &u))
|
||||
return test_fail("sub #0 copy failed: %d", errno);
|
||||
|
||||
if (t.val != 103)
|
||||
return test_fail("sub #0 val. mismatch: %d", t.val);
|
||||
if (u.val != 103)
|
||||
return test_fail("sub #0 val. mismatch: %d", u.val);
|
||||
|
||||
int sfd1 = orb_subscribe_multi(ORB_ID(orb_multitest), 1);
|
||||
|
||||
if (OK != orb_copy(ORB_ID(orb_multitest), sfd1, &t))
|
||||
if (OK != orb_copy(ORB_ID(orb_multitest), sfd1, &u))
|
||||
return test_fail("sub #1 copy failed: %d", errno);
|
||||
|
||||
if (t.val != 203)
|
||||
return test_fail("sub #1 val. mismatch: %d", t.val);
|
||||
if (u.val != 203)
|
||||
return test_fail("sub #1 val. mismatch: %d", u.val);
|
||||
|
||||
/* test priorities */
|
||||
int prio;
|
||||
@@ -833,6 +874,30 @@ test()
|
||||
if (prio != ORB_PRIO_MIN)
|
||||
return test_fail("prio: %d", prio);
|
||||
|
||||
/* test pub / sub latency */
|
||||
|
||||
int pubsub_task = task_spawn_cmd("uorb_latency",
|
||||
SCHED_DEFAULT,
|
||||
SCHED_PRIORITY_MAX - 5,
|
||||
1500,
|
||||
(main_t)&pubsublatency_main,
|
||||
nullptr);
|
||||
|
||||
/* give the test task some data */
|
||||
while (!pubsubtest_passed) {
|
||||
t.val = 303;
|
||||
t.time = hrt_absolute_time();
|
||||
if (OK != orb_publish(ORB_ID(orb_multitest), pfd0, &t))
|
||||
return test_fail("mult. pub0 timing fail");
|
||||
|
||||
/* simulate >800 Hz system operation */
|
||||
usleep(1000);
|
||||
}
|
||||
|
||||
if (pubsub_task < 0) {
|
||||
return test_fail("failed launching task");
|
||||
}
|
||||
|
||||
return test_note("PASS");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user