mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-01 19:07:45 +08:00
sdlog2 performance increased, fixes and cleanup
This commit is contained in:
@@ -33,9 +33,9 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file sdlog2_ringbuffer.c
|
* @file logbuffer.c
|
||||||
*
|
*
|
||||||
* Ring FIFO buffer for binary data.
|
* Ring FIFO buffer for binary log data.
|
||||||
*
|
*
|
||||||
* @author Anton Babushkin <rk3dov@gmail.com>
|
* @author Anton Babushkin <rk3dov@gmail.com>
|
||||||
*/
|
*/
|
||||||
@@ -43,9 +43,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "sdlog2_ringbuffer.h"
|
#include "logbuffer.h"
|
||||||
|
|
||||||
void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int size)
|
void logbuffer_init(struct logbuffer_s *lb, int size)
|
||||||
{
|
{
|
||||||
lb->size = size;
|
lb->size = size;
|
||||||
lb->write_ptr = 0;
|
lb->write_ptr = 0;
|
||||||
@@ -53,7 +53,7 @@ void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int size)
|
|||||||
lb->data = malloc(lb->size);
|
lb->data = malloc(lb->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb)
|
int logbuffer_free(struct logbuffer_s *lb)
|
||||||
{
|
{
|
||||||
int n = lb->read_ptr - lb->write_ptr - 1;
|
int n = lb->read_ptr - lb->write_ptr - 1;
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb)
|
int logbuffer_count(struct logbuffer_s *lb)
|
||||||
{
|
{
|
||||||
int n = lb->write_ptr - lb->read_ptr;
|
int n = lb->write_ptr - lb->read_ptr;
|
||||||
|
|
||||||
@@ -75,12 +75,12 @@ int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdlog2_logbuffer_is_empty(struct sdlog2_logbuffer *lb)
|
int logbuffer_is_empty(struct logbuffer_s *lb)
|
||||||
{
|
{
|
||||||
return lb->read_ptr == lb->write_ptr;
|
return lb->read_ptr == lb->write_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size)
|
bool logbuffer_write(struct logbuffer_s *lb, void *ptr, int size)
|
||||||
{
|
{
|
||||||
// bytes available to write
|
// bytes available to write
|
||||||
int available = lb->read_ptr - lb->write_ptr - 1;
|
int available = lb->read_ptr - lb->write_ptr - 1;
|
||||||
@@ -90,7 +90,7 @@ void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size)
|
|||||||
|
|
||||||
if (size > available) {
|
if (size > available) {
|
||||||
// buffer overflow
|
// buffer overflow
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *c = (char *) ptr;
|
char *c = (char *) ptr;
|
||||||
@@ -109,9 +109,10 @@ void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size)
|
|||||||
int p = size - n; // number of bytes to write
|
int p = size - n; // number of bytes to write
|
||||||
memcpy(&(lb->data[lb->write_ptr]), &(c[n]), p);
|
memcpy(&(lb->data[lb->write_ptr]), &(c[n]), p);
|
||||||
lb->write_ptr = (lb->write_ptr + p) % lb->size;
|
lb->write_ptr = (lb->write_ptr + p) % lb->size;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdlog2_logbuffer_get_ptr(struct sdlog2_logbuffer *lb, void **ptr)
|
int logbuffer_get_ptr(struct logbuffer_s *lb, void **ptr, bool *is_part)
|
||||||
{
|
{
|
||||||
// bytes available to read
|
// bytes available to read
|
||||||
int available = lb->write_ptr - lb->read_ptr;
|
int available = lb->write_ptr - lb->read_ptr;
|
||||||
@@ -125,17 +126,19 @@ int sdlog2_logbuffer_get_ptr(struct sdlog2_logbuffer *lb, void **ptr)
|
|||||||
if (available > 0) {
|
if (available > 0) {
|
||||||
// read pointer is before write pointer, write all available bytes
|
// read pointer is before write pointer, write all available bytes
|
||||||
n = available;
|
n = available;
|
||||||
|
*is_part = false;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// read pointer is after write pointer, write bytes from read_ptr to end
|
// read pointer is after write pointer, write bytes from read_ptr to end
|
||||||
n = lb->size - lb->read_ptr;
|
n = lb->size - lb->read_ptr;
|
||||||
|
*is_part = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ptr = &(lb->data[lb->read_ptr]);
|
*ptr = &(lb->data[lb->read_ptr]);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdlog2_logbuffer_mark_read(struct sdlog2_logbuffer *lb, int n)
|
void logbuffer_mark_read(struct logbuffer_s *lb, int n)
|
||||||
{
|
{
|
||||||
lb->read_ptr = (lb->read_ptr + n) % lb->size;
|
lb->read_ptr = (lb->read_ptr + n) % lb->size;
|
||||||
}
|
}
|
||||||
@@ -33,9 +33,9 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file sdlog2_ringbuffer.h
|
* @file logbuffer.h
|
||||||
*
|
*
|
||||||
* Ring FIFO buffer for binary data.
|
* Ring FIFO buffer for binary log data.
|
||||||
*
|
*
|
||||||
* @author Anton Babushkin <rk3dov@gmail.com>
|
* @author Anton Babushkin <rk3dov@gmail.com>
|
||||||
*/
|
*/
|
||||||
@@ -43,7 +43,9 @@
|
|||||||
#ifndef SDLOG2_RINGBUFFER_H_
|
#ifndef SDLOG2_RINGBUFFER_H_
|
||||||
#define SDLOG2_RINGBUFFER_H_
|
#define SDLOG2_RINGBUFFER_H_
|
||||||
|
|
||||||
struct sdlog2_logbuffer {
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
struct logbuffer_s {
|
||||||
// all pointers are in bytes
|
// all pointers are in bytes
|
||||||
int write_ptr;
|
int write_ptr;
|
||||||
int read_ptr;
|
int read_ptr;
|
||||||
@@ -51,18 +53,18 @@ struct sdlog2_logbuffer {
|
|||||||
char *data;
|
char *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
void sdlog2_logbuffer_init(struct sdlog2_logbuffer *lb, int size);
|
void logbuffer_init(struct logbuffer_s *lb, int size);
|
||||||
|
|
||||||
int sdlog2_logbuffer_free(struct sdlog2_logbuffer *lb);
|
int logbuffer_free(struct logbuffer_s *lb);
|
||||||
|
|
||||||
int sdlog2_logbuffer_count(struct sdlog2_logbuffer *lb);
|
int logbuffer_count(struct logbuffer_s *lb);
|
||||||
|
|
||||||
int sdlog2_logbuffer_is_empty(struct sdlog2_logbuffer *lb);
|
int logbuffer_is_empty(struct logbuffer_s *lb);
|
||||||
|
|
||||||
void sdlog2_logbuffer_write(struct sdlog2_logbuffer *lb, void *ptr, int size);
|
bool logbuffer_write(struct logbuffer_s *lb, void *ptr, int size);
|
||||||
|
|
||||||
int sdlog2_logbuffer_get_ptr(struct sdlog2_logbuffer *lb, void **ptr);
|
int logbuffer_get_ptr(struct logbuffer_s *lb, void **ptr, bool *is_part);
|
||||||
|
|
||||||
void sdlog2_logbuffer_mark_read(struct sdlog2_logbuffer *lb, int n);
|
void logbuffer_mark_read(struct logbuffer_s *lb, int n);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -40,4 +40,4 @@ MODULE_COMMAND = sdlog2
|
|||||||
MODULE_PRIORITY = "SCHED_PRIORITY_MAX-30"
|
MODULE_PRIORITY = "SCHED_PRIORITY_MAX-30"
|
||||||
|
|
||||||
SRCS = sdlog2.c \
|
SRCS = sdlog2.c \
|
||||||
sdlog2_ringbuffer.c
|
logbuffer.c
|
||||||
|
|||||||
+328
-158
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user