feat(kernel/fifo): Optimize the creation of fifo.
This commit is contained in:
@@ -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);
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) */
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user