mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-06 21:11:35 +08:00
dataman: add read and write perf counters
This commit is contained in:
@@ -47,27 +47,17 @@
|
|||||||
#include <px4_platform_common/posix.h>
|
#include <px4_platform_common/posix.h>
|
||||||
#include <px4_platform_common/tasks.h>
|
#include <px4_platform_common/tasks.h>
|
||||||
#include <px4_platform_common/getopt.h>
|
#include <px4_platform_common/getopt.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <queue.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <semaphore.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <drivers/drv_hrt.h>
|
#include <drivers/drv_hrt.h>
|
||||||
|
#include <lib/parameters/param.h>
|
||||||
|
#include <lib/perf/perf_counter.h>
|
||||||
|
|
||||||
#include "dataman.h"
|
#include "dataman.h"
|
||||||
#include <parameters/param.h>
|
|
||||||
|
|
||||||
#if defined(FLASH_BASED_DATAMAN)
|
#if defined(FLASH_BASED_DATAMAN)
|
||||||
#include <nuttx/clock.h>
|
#include <nuttx/clock.h>
|
||||||
#include <nuttx/progmem.h>
|
#include <nuttx/progmem.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
__EXPORT int dataman_main(int argc, char *argv[]);
|
__EXPORT int dataman_main(int argc, char *argv[]);
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
@@ -247,6 +237,9 @@ static px4_sem_t *g_item_locks[DM_KEY_NUM_KEYS];
|
|||||||
static px4_sem_t g_sys_state_mutex_mission;
|
static px4_sem_t g_sys_state_mutex_mission;
|
||||||
static px4_sem_t g_sys_state_mutex_fence;
|
static px4_sem_t g_sys_state_mutex_fence;
|
||||||
|
|
||||||
|
static perf_counter_t _dm_read_perf{nullptr};
|
||||||
|
static perf_counter_t _dm_write_perf{nullptr};
|
||||||
|
|
||||||
/* The data manager store file handle and file name */
|
/* The data manager store file handle and file name */
|
||||||
static const char *default_device_path = PX4_STORAGEDIR "/dataman";
|
static const char *default_device_path = PX4_STORAGEDIR "/dataman";
|
||||||
static char *k_data_manager_device_path = nullptr;
|
static char *k_data_manager_device_path = nullptr;
|
||||||
@@ -1085,8 +1078,11 @@ dm_write(dm_item_t item, unsigned index, dm_persitence_t persistence, const void
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
perf_begin(_dm_write_perf);
|
||||||
|
|
||||||
/* get a work item and queue up a write request */
|
/* get a work item and queue up a write request */
|
||||||
if ((work = create_work_item()) == nullptr) {
|
if ((work = create_work_item()) == nullptr) {
|
||||||
|
perf_end(_dm_write_perf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1098,7 +1094,9 @@ dm_write(dm_item_t item, unsigned index, dm_persitence_t persistence, const void
|
|||||||
work->write_params.count = count;
|
work->write_params.count = count;
|
||||||
|
|
||||||
/* Enqueue the item on the work queue and wait for the worker thread to complete processing it */
|
/* Enqueue the item on the work queue and wait for the worker thread to complete processing it */
|
||||||
return (ssize_t)enqueue_work_item_and_wait_for_result(work);
|
ssize_t ret = (ssize_t)enqueue_work_item_and_wait_for_result(work);
|
||||||
|
perf_end(_dm_write_perf);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Retrieve from the data manager file */
|
/** Retrieve from the data manager file */
|
||||||
@@ -1112,8 +1110,11 @@ dm_read(dm_item_t item, unsigned index, void *buf, size_t count)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
perf_begin(_dm_read_perf);
|
||||||
|
|
||||||
/* get a work item and queue up a read request */
|
/* get a work item and queue up a read request */
|
||||||
if ((work = create_work_item()) == nullptr) {
|
if ((work = create_work_item()) == nullptr) {
|
||||||
|
perf_end(_dm_read_perf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1124,7 +1125,9 @@ dm_read(dm_item_t item, unsigned index, void *buf, size_t count)
|
|||||||
work->read_params.count = count;
|
work->read_params.count = count;
|
||||||
|
|
||||||
/* Enqueue the item on the work queue and wait for the worker thread to complete processing it */
|
/* Enqueue the item on the work queue and wait for the worker thread to complete processing it */
|
||||||
return (ssize_t)enqueue_work_item_and_wait_for_result(work);
|
ssize_t ret = (ssize_t)enqueue_work_item_and_wait_for_result(work);
|
||||||
|
perf_end(_dm_read_perf);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Clear a data Item */
|
/** Clear a data Item */
|
||||||
@@ -1307,6 +1310,9 @@ task_main(int argc, char *argv[])
|
|||||||
|
|
||||||
px4_sem_setprotocol(&g_work_queued_sema, SEM_PRIO_NONE);
|
px4_sem_setprotocol(&g_work_queued_sema, SEM_PRIO_NONE);
|
||||||
|
|
||||||
|
_dm_read_perf = perf_alloc(PC_ELAPSED, MODULE_NAME": read");
|
||||||
|
_dm_write_perf = perf_alloc(PC_ELAPSED, MODULE_NAME": write");
|
||||||
|
|
||||||
/* see if we need to erase any items based on restart type */
|
/* see if we need to erase any items based on restart type */
|
||||||
int sys_restart_val;
|
int sys_restart_val;
|
||||||
|
|
||||||
@@ -1433,6 +1439,12 @@ end:
|
|||||||
px4_sem_destroy(&g_sys_state_mutex_mission);
|
px4_sem_destroy(&g_sys_state_mutex_mission);
|
||||||
px4_sem_destroy(&g_sys_state_mutex_fence);
|
px4_sem_destroy(&g_sys_state_mutex_fence);
|
||||||
|
|
||||||
|
perf_free(_dm_read_perf);
|
||||||
|
_dm_read_perf = nullptr;
|
||||||
|
|
||||||
|
perf_free(_dm_write_perf);
|
||||||
|
_dm_write_perf = nullptr;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1471,6 +1483,8 @@ status()
|
|||||||
PX4_INFO("Clears %d", g_func_counts[dm_clear_func]);
|
PX4_INFO("Clears %d", g_func_counts[dm_clear_func]);
|
||||||
PX4_INFO("Restarts %d", g_func_counts[dm_restart_func]);
|
PX4_INFO("Restarts %d", g_func_counts[dm_restart_func]);
|
||||||
PX4_INFO("Max Q lengths work %d, free %d", g_work_q.max_size, g_free_q.max_size);
|
PX4_INFO("Max Q lengths work %d, free %d", g_work_q.max_size, g_free_q.max_size);
|
||||||
|
perf_print_counter(_dm_read_perf);
|
||||||
|
perf_print_counter(_dm_write_perf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
Reference in New Issue
Block a user