mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 02:55:07 +08:00
microbench add uorb and matrix test
This commit is contained in:
committed by
Lorenz Meier
parent
3ba97297d5
commit
ea0a80d4d1
@@ -88,6 +88,7 @@ px4_add_module(
|
|||||||
-Wno-missing-declarations
|
-Wno-missing-declarations
|
||||||
-Wno-double-promotion
|
-Wno-double-promotion
|
||||||
-Wno-unknown-warning-option
|
-Wno-unknown-warning-option
|
||||||
|
-Wno-unused-but-set-variable
|
||||||
SRCS
|
SRCS
|
||||||
${srcs}
|
${srcs}
|
||||||
DEPENDS
|
DEPENDS
|
||||||
|
|||||||
@@ -9,6 +9,13 @@
|
|||||||
#include <px4_config.h>
|
#include <px4_config.h>
|
||||||
#include <px4_micro_hal.h>
|
#include <px4_micro_hal.h>
|
||||||
|
|
||||||
|
#include <matrix/math.hpp>
|
||||||
|
|
||||||
|
#include <uORB/topics/sensor_accel.h>
|
||||||
|
#include <uORB/topics/sensor_gyro.h>
|
||||||
|
#include <uORB/topics/vehicle_local_position.h>
|
||||||
|
#include <uORB/topics/vehicle_status.h>
|
||||||
|
|
||||||
#ifdef __PX4_NUTTX
|
#ifdef __PX4_NUTTX
|
||||||
#include <nuttx/irq.h>
|
#include <nuttx/irq.h>
|
||||||
static irqstate_t flags;
|
static irqstate_t flags;
|
||||||
@@ -63,29 +70,41 @@ private:
|
|||||||
|
|
||||||
bool time_px4_hrt();
|
bool time_px4_hrt();
|
||||||
|
|
||||||
|
bool time_px4_uorb();
|
||||||
|
|
||||||
|
bool time_px4_matrix();
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
|
||||||
volatile float f32;
|
float f32;
|
||||||
volatile float f32_out;
|
float f32_out;
|
||||||
|
|
||||||
volatile double f64;
|
double f64;
|
||||||
volatile double f64_out;
|
double f64_out;
|
||||||
|
|
||||||
volatile uint8_t i_8;
|
uint8_t i_8;
|
||||||
volatile uint8_t i_8_out;
|
uint8_t i_8_out;
|
||||||
|
|
||||||
volatile uint16_t i_16;
|
uint16_t i_16;
|
||||||
volatile uint16_t i_16_out;
|
uint16_t i_16_out;
|
||||||
|
|
||||||
volatile uint32_t i_32;
|
uint32_t i_32;
|
||||||
volatile uint32_t i_32_out;
|
uint32_t i_32_out;
|
||||||
|
|
||||||
volatile int64_t i_64;
|
int64_t i_64;
|
||||||
volatile int64_t i_64_out;
|
int64_t i_64_out;
|
||||||
|
|
||||||
volatile uint64_t u_64;
|
uint64_t u_64;
|
||||||
volatile uint64_t u_64_out;
|
uint64_t u_64_out;
|
||||||
|
|
||||||
|
vehicle_status_s status;
|
||||||
|
vehicle_local_position_s lpos;
|
||||||
|
sensor_gyro_s gyro;
|
||||||
|
|
||||||
|
matrix::Quatf q;
|
||||||
|
matrix::Eulerf e;
|
||||||
|
matrix::Dcmf d;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool MicroBench::run_tests()
|
bool MicroBench::run_tests()
|
||||||
@@ -99,6 +118,8 @@ bool MicroBench::run_tests()
|
|||||||
ut_run_test(time_32bit_integers);
|
ut_run_test(time_32bit_integers);
|
||||||
ut_run_test(time_64bit_integers);
|
ut_run_test(time_64bit_integers);
|
||||||
ut_run_test(time_px4_hrt);
|
ut_run_test(time_px4_hrt);
|
||||||
|
ut_run_test(time_px4_uorb);
|
||||||
|
ut_run_test(time_px4_matrix);
|
||||||
|
|
||||||
return (_tests_failed == 0);
|
return (_tests_failed == 0);
|
||||||
}
|
}
|
||||||
@@ -135,6 +156,19 @@ void MicroBench::reset()
|
|||||||
|
|
||||||
u_64 = rand();
|
u_64 = rand();
|
||||||
u_64_out = rand();
|
u_64_out = rand();
|
||||||
|
|
||||||
|
status.timestamp = rand();
|
||||||
|
status.mission_failure = rand();
|
||||||
|
|
||||||
|
lpos.timestamp = rand();
|
||||||
|
lpos.dist_bottom_valid = rand();
|
||||||
|
|
||||||
|
gyro.timestamp = rand();
|
||||||
|
gyro.temperature_raw = rand();
|
||||||
|
|
||||||
|
q = matrix::Quatf(rand(), rand(), rand(), rand());
|
||||||
|
e = matrix::Eulerf(random(-2.0 * M_PI, 2.0 * M_PI), random(-2.0 * M_PI, 2.0 * M_PI), random(-2.0 * M_PI, 2.0 * M_PI));
|
||||||
|
d = q;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_declare_test_c(test_microbench, MicroBench)
|
ut_declare_test_c(test_microbench, MicroBench)
|
||||||
@@ -237,3 +271,52 @@ bool MicroBench::time_px4_hrt()
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MicroBench::time_px4_uorb()
|
||||||
|
{
|
||||||
|
int fd_status = orb_subscribe(ORB_ID(vehicle_status));
|
||||||
|
int fd_lpos = orb_subscribe(ORB_ID(vehicle_local_position));
|
||||||
|
int fd_gyro = orb_subscribe(ORB_ID(sensor_gyro));
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
bool updated = false;
|
||||||
|
uint64_t time = 0;
|
||||||
|
|
||||||
|
PERF("orb_check vehicle_status", ret = orb_check(fd_status, &updated), 1000);
|
||||||
|
PERF("orb_stat vehicle_status", ret = orb_stat(fd_status, &time), 1000);
|
||||||
|
PERF("orb_copy vehicle_status", ret = orb_copy(ORB_ID(vehicle_status), fd_status, &status), 1000);
|
||||||
|
|
||||||
|
PERF("orb_check vehicle_local_position", ret = orb_check(fd_lpos, &updated), 1000);
|
||||||
|
PERF("orb_stat vehicle_local_position", ret = orb_stat(fd_lpos, &time), 1000);
|
||||||
|
PERF("orb_copy vehicle_local_position", ret = orb_copy(ORB_ID(vehicle_local_position), fd_lpos, &lpos), 1000);
|
||||||
|
|
||||||
|
PERF("orb_check sensor_gyro", ret = orb_check(fd_gyro, &updated), 1000);
|
||||||
|
PERF("orb_stat sensor_gyro", ret = orb_stat(fd_gyro, &time), 1000);
|
||||||
|
PERF("orb_copy sensor_gyro", ret = orb_copy(ORB_ID(sensor_gyro), fd_gyro, &lpos), 1000);
|
||||||
|
|
||||||
|
PERF("orb_exists sensor_accel 0", ret = orb_exists(ORB_ID(sensor_accel), 0), 100);
|
||||||
|
PERF("orb_exists sensor_accel 1", ret = orb_exists(ORB_ID(sensor_accel), 1), 100);
|
||||||
|
PERF("orb_exists sensor_accel 2", ret = orb_exists(ORB_ID(sensor_accel), 2), 100);
|
||||||
|
PERF("orb_exists sensor_accel 3", ret = orb_exists(ORB_ID(sensor_accel), 3), 100);
|
||||||
|
PERF("orb_exists sensor_accel 4", ret = orb_exists(ORB_ID(sensor_accel), 4), 100);
|
||||||
|
|
||||||
|
orb_unsubscribe(fd_status);
|
||||||
|
orb_unsubscribe(fd_lpos);
|
||||||
|
orb_unsubscribe(fd_gyro);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MicroBench::time_px4_matrix()
|
||||||
|
{
|
||||||
|
PERF("matrix Euler from Quaternion", e = q, 1000);
|
||||||
|
PERF("matrix Euler from Dcm", e = d, 1000);
|
||||||
|
|
||||||
|
PERF("matrix Quaternion from Euler", q = e, 1000);
|
||||||
|
PERF("matrix Quaternion from Dcm", q = d, 1000);
|
||||||
|
|
||||||
|
PERF("matrix Dcm from Euler", d = e, 1000);
|
||||||
|
PERF("matrix Dcm from Quaternion", d = q, 1000);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user