feat(kernel/fifo): Optimize the creation of fifo.

This commit is contained in:
MacRsh
2025-06-11 23:14:03 +08:00
parent 46bf4594c6
commit 2758172108
10 changed files with 22 additions and 42 deletions

View File

@@ -49,13 +49,13 @@ mr_uint32_t mr_fifo_init(mr_fifo_t *fifo, void *buf, mr_uint32_t size,
* @brief This function allocates a fifo.
*
* @param fifo The fifo.
* @param size The buffer size(bytes).
* @param num The buffer number.
* @param elem_size The element size(bytes).
* @return The element capacity(number).
*
* @note The buffer will be aligned up to a power of 2.
*/
mr_uint32_t mr_fifo_alloc(mr_fifo_t *fifo, mr_uint32_t size,
mr_uint32_t mr_fifo_alloc(mr_fifo_t *fifo, mr_uint32_t num,
mr_uint32_t elem_size);
/**

View File

@@ -152,7 +152,7 @@ MR_INLINE void mr_list_move(mr_list_t *entry, mr_list_t *head) {
*/
MR_INLINE mr_bool_t mr_list_is_empty(mr_list_t *head) {
/* Check if list is empty */
return (head->next == head) ? MR_TRUE : MR_FALSE;
return head->next == head;
}
/**

View File

@@ -44,7 +44,7 @@ typedef struct mr_workqueue {
mr_atomic_t running;
mr_atomic_t dying;
mr_list_t t_list;
mr_list_t list;
mr_list_t r_list;
#if defined(MR_USE_WORKQUEUE_HOOK)
mr_workqueue_hook_t hook;
#endif /* defined(MR_USE_WORKQUEUE_HOOK) */

View File

@@ -58,7 +58,7 @@ void *mr_malloc(mr_size_t size);
void mr_free(void *mem);
/**
* @brief This function returns the usable size of mem.
* @brief This function returns the usable size of memory.
*
* @param mem The memory.
* @return The usable size.

View File

@@ -5,27 +5,6 @@
extern "C" {
#endif /* __cplusplus */
#define MR_USE_PRINTF
#define MR_CFG_PRINTF_BUF_SIZE 64
#define MR_USE_TIMER
#define MR_USE_WORKQUEUE
#define MR_USE_IRQ
#define MR_USE_IRQ_DEFER
#define MR_CFG_IRQ_TABLE_SIZE 32
#define MR_CFG_CLOCK_HOOK_SIZE 2
#define MR_USE_ENTRY
#define MR_USE_64BIT_ARCH
#define MR_USE_MALLOC
#define MR_CFG_HEAP_SIZE 4096
#define MR_USE_SPRINTF
#define MR_USE_ASSERT
#define MR_USE_STRING
#define MR_USE_STRING_SAFE
#define MR_USE_SCANF
#define MR_USE_TYPES
#define MR_USE_ERRNO
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@@ -72,5 +72,5 @@ mr_err_t mr_clock_hook_add(mr_clock_hook_t *entry) {
MR_ASSERT(entry != MR_NULL);
/* Add hook to clock */
return mr_hook_add(&__hook, (mr_ptr_t)entry);
return mr_hook_add(&__hook, entry);
}

View File

@@ -33,16 +33,17 @@ mr_uint32_t mr_fifo_init(mr_fifo_t *fifo, void *buf, mr_uint32_t size,
return size;
}
mr_uint32_t mr_fifo_alloc(mr_fifo_t *fifo, mr_uint32_t size,
mr_uint32_t mr_fifo_alloc(mr_fifo_t *fifo, mr_uint32_t num,
mr_uint32_t elem_size) {
mr_uint32_t size;
void *buf;
/* Check parameter */
MR_ASSERT(fifo != MR_NULL);
MR_ASSERT((size >= 2) && (elem_size > 0) && (elem_size <= size));
MR_ASSERT((num > 0) && (elem_size > 0));
/* Align size(up to power of 2) */
size = FIFO_ALIGN_POW2_UP(size);
size = FIFO_ALIGN_POW2_UP(num * elem_size);
/* Allocate buffer */
buf = mr_realloc(fifo->buf, size);
@@ -146,7 +147,7 @@ mr_uint32_t mr_fifo_in(mr_fifo_t *fifo, const void *buf, mr_uint32_t num) {
/* Push buffer */
mr_memcpy((mr_uint8_t *)fifo->buf + in, buf, n);
mr_memcpy(fifo->buf, ((mr_uint8_t *)buf) + n, num - n);
mr_memcpy(fifo->buf, (mr_uint8_t *)buf + n, num - n);
fifo->in += num2;
return num2;
}
@@ -162,7 +163,7 @@ mr_uint32_t mr_fifo_in_overwrite(mr_fifo_t *fifo, const void *buf,
/* Limit number */
capacity = fifo->mask + 1;
if (num > capacity) {
buf = ((mr_uint8_t *)buf) + ((num - capacity) * fifo->elem_size);
buf = (mr_uint8_t *)buf + ((num - capacity) * fifo->elem_size);
num = capacity;
}

View File

@@ -19,8 +19,8 @@ void mr_hook_init(mr_hook_t *hook, mr_ptr_t *entry, mr_size_t size) {
MR_ASSERT((entry != MR_NULL) || (size == 0));
/* Initialize hook */
hook->size = entry ? size : 0;
hook->entry = entry;
hook->size = size;
hook->next = 0;
}

View File

@@ -73,7 +73,7 @@ static void queue_timer_entry(mr_timer_t *timer, void *param) {
}
/* Move work to workqueue work list */
mr_list_move(&work->list, &queue->list);
mr_list_move(&work->list, &queue->r_list);
}
/* Check if workqueue need set timer tick */
@@ -114,7 +114,7 @@ static mr_err_t workqueue_init(mr_workqueue_t *queue, const mr_class_t *class) {
mr_atomic_init(&queue->running, MR_FALSE);
mr_atomic_init(&queue->dying, MR_FALSE);
mr_list_init(&queue->t_list);
mr_list_init(&queue->list);
mr_list_init(&queue->r_list);
#if defined(MR_USE_WORKQUEUE_HOOK)
queue->hook.suspend = MR_NULL;
queue->hook.wakeup = MR_NULL;
@@ -201,7 +201,7 @@ mr_err_t mr_workqueue_execute(mr_workqueue_t *queue) {
MR_ASSERT(MR_OBJECT_CLASS_IS_OR(queue, &__class1, &__class2));
/* Reduce unnecessary lock operations */
if (mr_list_is_empty(&queue->list)
if (mr_list_is_empty(&queue->r_list)
#if defined(MR_USE_WORKQUEUE_HOOK)
&& (!queue->hook.suspend)
#endif /* defined(MR_USE_WORKQUEUE_HOOK) */
@@ -213,8 +213,8 @@ mr_err_t mr_workqueue_execute(mr_workqueue_t *queue) {
mask = mr_spinlock_lock_irqsave(&__lock);
/* Check workqueue work list */
while (!mr_list_is_empty(&queue->list)) {
work = MR_LIST_ENTRY(queue->list.next, mr_work_t, list);
while (!mr_list_is_empty(&queue->r_list)) {
work = MR_LIST_ENTRY(queue->r_list.next, mr_work_t, list);
/* Remove work from running list */
mr_list_del(&work->list);
@@ -265,7 +265,7 @@ mr_err_t mr_workqueue_work(mr_workqueue_t *queue, mr_work_t *work) {
}
/* Add work to running list */
mr_list_add(&queue->list, &work->list);
mr_list_add(&queue->r_list, &work->list);
work->queue = queue;
/* Unlock */
@@ -463,8 +463,8 @@ static void queue_del(mr_workqueue_t *queue) {
}
/* Remove work from workqueue running list */
while (!mr_list_is_empty(&queue->list)) {
work = MR_LIST_ENTRY(&queue->list.next, mr_work_t, list);
while (!mr_list_is_empty(&queue->r_list)) {
work = MR_LIST_ENTRY(&queue->r_list.next, mr_work_t, list);
mr_list_del(&work->list);
}

View File

@@ -90,7 +90,7 @@ void *mr_memcpy(void *dst, const void *src, mr_size_t size) {
}
} else {
/* Copy aligned bytes */
for (d = dst, s = src; (size >= sizeof(mr_uintptr_t));
for (d = dst, s = src; size >= sizeof(mr_uintptr_t);
size -= sizeof(mr_uintptr_t)) {
*(mr_uintptr_t *)d = *(mr_uintptr_t *)s;
d += sizeof(mr_uintptr_t);