From 0f8c6b90f7c4e43beaa83ce2e694980952a79b9f Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sun, 2 Dec 2018 15:09:24 +0000 Subject: New buffers performance tuning option added. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12456 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/hal/include/hal_buffers.h | 14 ++++++++++++++ os/hal/src/hal_buffers.c | 20 ++++++++++---------- 2 files changed, 24 insertions(+), 10 deletions(-) (limited to 'os/hal') diff --git a/os/hal/include/hal_buffers.h b/os/hal/include/hal_buffers.h index 164ab82bc..9c5ea42d6 100644 --- a/os/hal/include/hal_buffers.h +++ b/os/hal/include/hal_buffers.h @@ -33,10 +33,24 @@ /* Driver pre-compile time settings. */ /*===========================================================================*/ +/** + * @brief Maximum size of blocks copied in critical sections. + * @note Increasing this value increases performance at expense of + * IRQ servicing efficiency. + * @note It must be a power of two. + */ +#if !defined(BUFFERS_CHUNKS_SIZE) || defined(__DOXYGEN__) +#define BUFFERS_CHUNKS_SIZE 64 +#endif + /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ +#if (BUFFERS_CHUNKS_SIZE & (BUFFERS_CHUNKS_SIZE - 1)) != 0 +#error "BUFFERS_CHUNKS_SIZE must be a power of two" +#endif + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ diff --git a/os/hal/src/hal_buffers.c b/os/hal/src/hal_buffers.c index f7b2c9f4a..1ca880f1a 100644 --- a/os/hal/src/hal_buffers.c +++ b/os/hal/src/hal_buffers.c @@ -388,12 +388,12 @@ size_t ibqReadTimeout(input_buffers_queue_t *ibqp, uint8_t *bp, /* Smaller chunks in order to not make the critical zone too long, this impacts throughput however.*/ - if (size > 64U) { + if (size > (size_t)BUFFERS_CHUNKS_SIZE) { /* Giving the compiler a chance to optimize for a fixed size move.*/ - memcpy(bp, ibqp->ptr, 64U); - bp += 64U; - ibqp->ptr += 64U; - r += 64U; + memcpy(bp, ibqp->ptr, BUFFERS_CHUNKS_SIZE); + bp += (size_t)BUFFERS_CHUNKS_SIZE; + ibqp->ptr += (size_t)BUFFERS_CHUNKS_SIZE; + r += (size_t)BUFFERS_CHUNKS_SIZE; } else { memcpy(bp, ibqp->ptr, size); @@ -751,12 +751,12 @@ size_t obqWriteTimeout(output_buffers_queue_t *obqp, const uint8_t *bp, /* Smaller chunks in order to not make the critical zone too long, this impacts throughput however.*/ - if (size > 64U) { + if (size > (size_t)BUFFERS_CHUNKS_SIZE) { /* Giving the compiler a chance to optimize for a fixed size move.*/ - memcpy(obqp->ptr, bp, 64U); - bp += 64U; - obqp->ptr += 64U; - w += 64U; + memcpy(obqp->ptr, bp, (size_t)BUFFERS_CHUNKS_SIZE); + bp += (size_t)BUFFERS_CHUNKS_SIZE; + obqp->ptr += (size_t)BUFFERS_CHUNKS_SIZE; + w += (size_t)BUFFERS_CHUNKS_SIZE; } else { memcpy(obqp->ptr, bp, size); -- cgit v1.2.3