aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
authorGiovanni Di Sirio <gdisirio@gmail.com>2018-12-02 15:09:24 +0000
committerGiovanni Di Sirio <gdisirio@gmail.com>2018-12-02 15:09:24 +0000
commit0f8c6b90f7c4e43beaa83ce2e694980952a79b9f (patch)
treea96cc9b9e5486bef4b8503641a7e068430b7376a /os/hal
parent559b4aa2d31e6bc4bbf9fbb7202608fefc5a57cc (diff)
downloadChibiOS-0f8c6b90f7c4e43beaa83ce2e694980952a79b9f.tar.gz
ChibiOS-0f8c6b90f7c4e43beaa83ce2e694980952a79b9f.tar.bz2
ChibiOS-0f8c6b90f7c4e43beaa83ce2e694980952a79b9f.zip
New buffers performance tuning option added.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12456 110e8d01-0319-4d1e-a829-52ad28d1bb01
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/include/hal_buffers.h14
-rw-r--r--os/hal/src/hal_buffers.c20
2 files changed, 24 insertions, 10 deletions
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);