mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-28 10:46:33 +08:00
param add perf counters
This commit is contained in:
committed by
Lorenz Meier
parent
c8590e0fb1
commit
641129ad4e
@@ -41,29 +41,20 @@
|
|||||||
* and background parameter saving.
|
* and background parameter saving.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#include <debug.h>
|
#include "param.h"
|
||||||
#include <px4_defines.h>
|
|
||||||
#include <px4_posix.h>
|
|
||||||
#include <px4_config.h>
|
|
||||||
#include <px4_shutdown.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <px4_sem.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include <sys/stat.h>
|
#include <px4_defines.h>
|
||||||
|
#include <px4_posix.h>
|
||||||
|
#include <px4_sem.h>
|
||||||
|
#include <px4_shutdown.h>
|
||||||
#include <drivers/drv_hrt.h>
|
#include <drivers/drv_hrt.h>
|
||||||
|
#include <systemlib/perf_counter.h>
|
||||||
|
|
||||||
#include "systemlib/param/param.h"
|
#include <systemlib/uthash/utarray.h>
|
||||||
#include "systemlib/uthash/utarray.h"
|
#include <systemlib/bson/tinybson.h>
|
||||||
#include "systemlib/bson/tinybson.h"
|
|
||||||
|
|
||||||
//#define PARAM_NO_ORB ///< if defined, avoid uorb dependency. This disables publication of parameter_update on param change
|
//#define PARAM_NO_ORB ///< if defined, avoid uorb dependency. This disables publication of parameter_update on param change
|
||||||
//#define PARAM_NO_AUTOSAVE ///< if defined, do not autosave (avoids LP work queue dependency)
|
//#define PARAM_NO_AUTOSAVE ///< if defined, do not autosave (avoids LP work queue dependency)
|
||||||
@@ -171,6 +162,10 @@ static px4_sem_t param_sem; ///< this protects against concurrent access to para
|
|||||||
static int reader_lock_holders = 0;
|
static int reader_lock_holders = 0;
|
||||||
static px4_sem_t reader_lock_holders_lock; ///< this protects against concurrent access to reader_lock_holders
|
static px4_sem_t reader_lock_holders_lock; ///< this protects against concurrent access to reader_lock_holders
|
||||||
|
|
||||||
|
static perf_counter_t param_export_perf;
|
||||||
|
static perf_counter_t param_get_perf;
|
||||||
|
static perf_counter_t param_set_perf;
|
||||||
|
|
||||||
static px4_sem_t param_sem_save; ///< this protects against concurrent param saves (file or flash access).
|
static px4_sem_t param_sem_save; ///< this protects against concurrent param saves (file or flash access).
|
||||||
///< we use a separate lock to allow concurrent param reads and saves.
|
///< we use a separate lock to allow concurrent param reads and saves.
|
||||||
///< a param_set could still be blocked by a param save, because it
|
///< a param_set could still be blocked by a param save, because it
|
||||||
@@ -235,6 +230,10 @@ param_init(void)
|
|||||||
px4_sem_init(¶m_sem, 0, 1);
|
px4_sem_init(¶m_sem, 0, 1);
|
||||||
px4_sem_init(¶m_sem_save, 0, 1);
|
px4_sem_init(¶m_sem_save, 0, 1);
|
||||||
px4_sem_init(&reader_lock_holders_lock, 0, 1);
|
px4_sem_init(&reader_lock_holders_lock, 0, 1);
|
||||||
|
|
||||||
|
param_export_perf = perf_alloc(PC_ELAPSED, "param_export");
|
||||||
|
param_get_perf = perf_alloc(PC_ELAPSED, "param_get");
|
||||||
|
param_set_perf = perf_alloc(PC_ELAPSED, "param_set");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -579,6 +578,7 @@ param_get(param_t param, void *val)
|
|||||||
int result = -1;
|
int result = -1;
|
||||||
|
|
||||||
param_lock_reader();
|
param_lock_reader();
|
||||||
|
perf_begin(param_get_perf);
|
||||||
|
|
||||||
const void *v = param_get_value_ptr(param);
|
const void *v = param_get_value_ptr(param);
|
||||||
|
|
||||||
@@ -587,6 +587,7 @@ param_get(param_t param, void *val)
|
|||||||
result = 0;
|
result = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
perf_end(param_get_perf);
|
||||||
param_unlock_reader();
|
param_unlock_reader();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -679,13 +680,14 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
|
|||||||
bool params_changed = false;
|
bool params_changed = false;
|
||||||
|
|
||||||
param_lock_writer();
|
param_lock_writer();
|
||||||
|
perf_begin(param_set_perf);
|
||||||
|
|
||||||
if (param_values == NULL) {
|
if (param_values == NULL) {
|
||||||
utarray_new(param_values, ¶m_icd);
|
utarray_new(param_values, ¶m_icd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param_values == NULL) {
|
if (param_values == NULL) {
|
||||||
debug("failed to allocate modified values array");
|
PX4_ERR("failed to allocate modified values array");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,7 +738,7 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (s->val.p == NULL) {
|
if (s->val.p == NULL) {
|
||||||
debug("failed to allocate parameter storage");
|
PX4_ERR("failed to allocate parameter storage");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -758,6 +760,7 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
perf_end(param_set_perf);
|
||||||
param_unlock_writer();
|
param_unlock_writer();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -895,6 +898,7 @@ param_reset_excludes(const char *excludes[], int num_excludes)
|
|||||||
if ((excludes[index][len - 1] == '*'
|
if ((excludes[index][len - 1] == '*'
|
||||||
&& strncmp(name, excludes[index], len - 1) == 0)
|
&& strncmp(name, excludes[index], len - 1) == 0)
|
||||||
|| strcmp(name, excludes[index]) == 0) {
|
|| strcmp(name, excludes[index]) == 0) {
|
||||||
|
|
||||||
exclude = true;
|
exclude = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -943,7 +947,7 @@ param_save_default(void)
|
|||||||
fd = PARAM_OPEN(filename, O_WRONLY | O_CREAT, PX4_O_MODE_666);
|
fd = PARAM_OPEN(filename, O_WRONLY | O_CREAT, PX4_O_MODE_666);
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
warn("failed to open param file: %s", filename);
|
PX4_ERR("failed to open param file: %s", filename);
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -960,7 +964,7 @@ param_save_default(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (res != OK) {
|
if (res != OK) {
|
||||||
warnx("failed to write parameters to file: %s", filename);
|
PX4_ERR("failed to write parameters to file: %s", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
PARAM_CLOSE(fd);
|
PARAM_CLOSE(fd);
|
||||||
@@ -969,6 +973,7 @@ param_save_default(void)
|
|||||||
res = flash_param_save();
|
res = flash_param_save();
|
||||||
param_unlock_writer();
|
param_unlock_writer();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1010,6 +1015,8 @@ param_load_default(void)
|
|||||||
int
|
int
|
||||||
param_export(int fd, bool only_unsaved)
|
param_export(int fd, bool only_unsaved)
|
||||||
{
|
{
|
||||||
|
perf_begin(param_export_perf);
|
||||||
|
|
||||||
struct param_wbuf_s *s = NULL;
|
struct param_wbuf_s *s = NULL;
|
||||||
struct bson_encoder_s encoder;
|
struct bson_encoder_s encoder;
|
||||||
int result = -1;
|
int result = -1;
|
||||||
@@ -1060,7 +1067,7 @@ param_export(int fd, bool only_unsaved)
|
|||||||
/* lock as short as possible */
|
/* lock as short as possible */
|
||||||
|
|
||||||
if (bson_encoder_append_int(&encoder, name, i)) {
|
if (bson_encoder_append_int(&encoder, name, i)) {
|
||||||
debug("BSON append failed for '%s'", name);
|
PX4_ERR("BSON append failed for '%s'", name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1072,7 +1079,7 @@ param_export(int fd, bool only_unsaved)
|
|||||||
const char *name = param_name(s->param);
|
const char *name = param_name(s->param);
|
||||||
|
|
||||||
if (bson_encoder_append_double(&encoder, name, f)) {
|
if (bson_encoder_append_double(&encoder, name, f)) {
|
||||||
debug("BSON append failed for '%s'", name);
|
PX4_ERR("BSON append failed for '%s'", name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1090,14 +1097,15 @@ param_export(int fd, bool only_unsaved)
|
|||||||
BSON_BIN_BINARY,
|
BSON_BIN_BINARY,
|
||||||
size,
|
size,
|
||||||
value_ptr)) {
|
value_ptr)) {
|
||||||
debug("BSON append failed for '%s'", name);
|
|
||||||
|
PX4_ERR("BSON append failed for '%s'", name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
debug("unrecognized parameter type");
|
PX4_ERR("unrecognized parameter type");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1121,6 +1129,8 @@ out:
|
|||||||
px4_shutdown_unlock();
|
px4_shutdown_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
perf_end(param_export_perf);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1208,12 +1218,12 @@ param_import_callback(bson_decoder_t decoder, void *private, bson_node_t node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
debug("failed allocating for '%s'", node->name);
|
PX4_ERR("failed allocating for '%s'", node->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bson_decoder_copy_data(decoder, tmp)) {
|
if (bson_decoder_copy_data(decoder, tmp)) {
|
||||||
debug("failed copying data for '%s'", node->name);
|
PX4_ERR("failed copying data for '%s'", node->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1251,16 +1261,14 @@ static int
|
|||||||
param_import_internal(int fd, bool mark_saved)
|
param_import_internal(int fd, bool mark_saved)
|
||||||
{
|
{
|
||||||
struct bson_decoder_s decoder;
|
struct bson_decoder_s decoder;
|
||||||
int result = -1;
|
|
||||||
struct param_import_state state;
|
struct param_import_state state;
|
||||||
|
int result = -1;
|
||||||
|
|
||||||
if (bson_decoder_init_file(&decoder, fd, param_import_callback, &state)) {
|
if (bson_decoder_init_file(&decoder, fd, param_import_callback, &state)) {
|
||||||
debug("decoder init failed");
|
PX4_ERR("decoder init failed");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
state.mark_saved = mark_saved;
|
state.mark_saved = mark_saved;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@@ -1272,7 +1280,7 @@ param_import_internal(int fd, bool mark_saved)
|
|||||||
out:
|
out:
|
||||||
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
debug("BSON error decoding parameters");
|
PX4_ERR("BSON error decoding parameters");
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
Reference in New Issue
Block a user