From 70bce9b264ec42b3a57f064349d11dd03972a4e6 Mon Sep 17 00:00:00 2001 From: MacRsh Date: Wed, 14 May 2025 23:56:35 +0800 Subject: [PATCH] feat(kfifo): Add kfifo overwrite write function. --- include/kernel/mr_kfifo.h | 11 +++++++++++ kernel/kfifo.c | 27 ++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/include/kernel/mr_kfifo.h b/include/kernel/mr_kfifo.h index 95630fb..cfb6246 100644 --- a/include/kernel/mr_kfifo.h +++ b/include/kernel/mr_kfifo.h @@ -93,6 +93,17 @@ mr_uint32_t mr_kfifo_pop(mr_kfifo_t *kfifo, void *data); */ mr_uint32_t mr_kfifo_in(mr_kfifo_t *kfifo, const void *buf, mr_uint32_t num); +/** + * @brief This function puts data to a kfifo with overwrite. + * + * @param kfifo The kfifo. + * @param buf The buffer. + * @param num The buffer number. + * @return The actual pushed element number. + */ +mr_uint32_t mr_kfifo_in_overwrite(mr_kfifo_t *kfifo, const void *buf, + mr_uint32_t num); + /** * @brief This function peeks data from a kfifo. * diff --git a/kernel/kfifo.c b/kernel/kfifo.c index 9d31716..cb79c6c 100644 --- a/kernel/kfifo.c +++ b/kernel/kfifo.c @@ -115,7 +115,7 @@ mr_uint32_t mr_kfifo_pop(mr_kfifo_t *kfifo, void *data) { mr_uint32_t mr_kfifo_in(mr_kfifo_t *kfifo, const void *buf, mr_uint32_t num) { mr_uint32_t avail, num2, in, size, n; - /* Limit length */ + /* Limit number */ avail = mr_kfifo_avail(kfifo); if (num > avail) { num = avail; @@ -142,10 +142,31 @@ mr_uint32_t mr_kfifo_in(mr_kfifo_t *kfifo, const void *buf, mr_uint32_t num) { return num2; } +mr_uint32_t mr_kfifo_in_overwrite(mr_kfifo_t *kfifo, const void *buf, + mr_uint32_t num) { + mr_uint32_t capacity, avail; + + /* Limit number */ + capacity = kfifo->mask + 1; + if (num > capacity) { + buf = ((mr_uint8_t *)buf) + ((num - capacity) * kfifo->elem_size); + num = capacity; + } + + /* Limit size */ + avail = mr_kfifo_avail(kfifo); + if (num > avail) { + mr_kfifo_skip(kfifo, num - avail); + } + + /* Push buffer */ + return mr_kfifo_in(kfifo, buf, num); +} + mr_uint32_t mr_kfifo_peek(mr_kfifo_t *kfifo, void *buf, mr_uint32_t num) { mr_uint32_t avail, num2, out, size, n; - /* Limit size */ + /* Limit number */ avail = mr_kfifo_len(kfifo); if (num > avail) { num = avail; @@ -164,7 +185,7 @@ mr_uint32_t mr_kfifo_peek(mr_kfifo_t *kfifo, void *buf, mr_uint32_t num) { num *= kfifo->elem_size; } - /* Pop buffer */ + /* Peek buffer */ n = MR_MIN(num, size - out); mr_memcpy(buf, (mr_uint8_t *)kfifo->buf + out, n); mr_memcpy((mr_uint8_t *)buf + n, kfifo->buf, num - n);