feat(kfifo): Add kfifo overwrite write function.

This commit is contained in:
MacRsh
2025-05-14 23:56:35 +08:00
parent 532d6e2bd6
commit 70bce9b264
2 changed files with 35 additions and 3 deletions

View File

@@ -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.
*

View File

@@ -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);