XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_task_queue.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_task_queue.h"
15
16/* ==================== [Defines] =========================================== */
17
18#define TAG "queue"
19
20/* ==================== [Typedefs] ========================================== */
21
22/* ==================== [Static Prototypes] ================================= */
23
24static void copy_data_from_queue(xf_task_queue_t *const queue, void *const buffer);
25static void copy_data_to_queue(xf_task_queue_t *const queue, const void *item, const bool pos);
26static void move_reader(xf_task_queue_t *const queue);
27
28/* ==================== [Static Variables] ================================== */
29
30/* ==================== [Macros] ============================================ */
31
32/* ==================== [Global Functions] ================================== */
33
34xf_err_t xf_task_queue_init(xf_task_queue_t *const queue, void *data, const size_t size, const size_t count)
35{
36 XF_ASSERT(queue, XF_ERR_INVALID_ARG, TAG, "queue must not be NULL");
37 XF_ASSERT(data, XF_ERR_INVALID_ARG, TAG, "data must not be NULL");
38 XF_ASSERT(size > 0, XF_ERR_INVALID_ARG, TAG, "size must more than 0");
39 XF_ASSERT(count > 0, XF_ERR_INVALID_ARG, TAG, "count must more than 0");
40
42
43 queue->count = count;
44 queue->size = size;
45 queue->head = (uint8_t *)data;
46
48 if (res != XF_OK) {
49 XF_LOGE(TAG, "queue reset failed");
50 return res;
51 }
52
53 return XF_OK;
54}
55
57{
58 XF_ASSERT(queue, XF_ERR_INVALID_ARG, TAG, "queue must not be NULL");
59
60 queue->tail = queue->head + (queue->count * queue->size);
61 queue->waiting = 0;
62 queue->writer = queue->head;
63 queue->reader = queue->head + ((queue->count - 1) * queue->size);
64
65 return XF_OK;
66}
67
69{
70 XF_ASSERT(queue, false, TAG, "queue must not be NULL");
71
72 return (0 == queue->waiting) ? true : false;
73}
74
76{
77 XF_ASSERT(queue, 0, TAG, "queue must not be NULL");
78
79 return queue->waiting;
80}
81
83{
84 XF_ASSERT(queue, NULL, TAG, "queue must not be NULL");
85
86 uint8_t *ret_value = NULL;
87
88 if (queue->waiting > 0) {
89 ret_value = (uint8_t *)(queue->reader + queue->size);
90 if (ret_value >= queue->tail) {
91 ret_value = queue->head;
92 }
93 }
94
95 return ret_value;
96}
97
99{
100 XF_ASSERT(queue, 0, TAG, "queue must not be NULL");
101
102 return queue->count - queue->waiting;
103}
104
106{
107 XF_ASSERT(queue, false, TAG, "queue must not be NULL");
108
109 if (queue->waiting == queue->count) {
110 return queue->waiting == queue->count;
111 }
112
113 return false;
114}
115
117{
118 XF_ASSERT(queue, XF_ERR_INVALID_ARG, TAG, "queue must not be NULL");
119 XF_ASSERT(pos == 1 || pos == 0, XF_ERR_INVALID_ARG,
120 TAG, "pos must be XF_TASK_QUEUE_SEND_TO_BACK or XF_TASK_QUEUE_SEND_TO_FRONT");
121
122 // 检测没满,则复制进队列
123 if (queue->waiting < queue->count) {
124 copy_data_to_queue(queue, item, (bool)pos);
125 return XF_OK;
126 }
127 return XF_ERR_BUSY;
128}
129
131{
132 XF_ASSERT(queue, XF_ERR_INVALID_ARG, TAG, "queue must not be NULL");
133
134 if (queue->waiting > 0) {
136 queue->waiting--;
137 return XF_OK;
138 }
139 return XF_ERR_BUSY;
140}
141
143{
144 XF_ASSERT(queue, XF_ERR_INVALID_ARG, TAG, "queue must not be NULL");
145 if (queue->waiting > 0) {
147 queue->waiting--;
148 return XF_OK;
149 }
150 return XF_ERR_BUSY;
151}
152
153/* ==================== [Static Functions] ================================== */
154
155static void copy_data_from_queue(xf_task_queue_t *const queue, void *const buffer)
156{
158 xf_memcpy(buffer, queue->reader, queue->size);
159}
160
161static void copy_data_to_queue(xf_task_queue_t *const queue, const void *item, const bool pos)
162{
163 if (0 == pos) {
164 xf_memcpy((void *)queue->writer, item, queue->size);
165 queue->writer += queue->size;
166 if (queue->writer >= queue->tail) {
167 queue->writer = queue->head;
168 }
169 } else {
170 xf_memcpy((void *)queue->reader, item, queue->size);
171 queue->reader -= queue->size;
172 if (queue->reader < queue->head) {
173 queue->reader = queue->tail - queue->size;
174 }
175 }
176 queue->waiting++;
177}
178
180{
181 queue->reader += queue->size;
182 if (queue->reader >= queue->tail) {
183 queue->reader = queue->head;
184 }
185}
bool xf_task_queue_is_full(const xf_task_queue_t *const queue)
判断队列是否已满。
xf_err_t xf_task_queue_receive(xf_task_queue_t *const queue, void *const buffer)
从队列接收一个元素。
xf_err_t xf_task_queue_reset(xf_task_queue_t *const queue)
重置队列。
bool xf_task_queue_is_empty(const xf_task_queue_t *const queue)
判断队列是否为空。
size_t xf_task_queue_available(const xf_task_queue_t *const queue)
获取队列剩余空间。
xf_err_t xf_task_queue_init(xf_task_queue_t *const queue, void *data, const size_t size, const size_t count)
队列对象初始化。
xf_err_t xf_task_queue_remove_front(xf_task_queue_t *const queue)
从队列删除第一个元素。
void * xf_task_queue_peek(const xf_task_queue_t *const queue)
获取队列第一个元素。
size_t xf_task_queue_count(const xf_task_queue_t *const queue)
获取队列数据个数
enum _xf_task_queue_mode_t xf_task_queue_mode_t
消息队列传输模式枚举。
xf_err_t xf_task_queue_send(xf_task_queue_t *const queue, void *item, const xf_task_queue_mode_t pos)
队列发送数据。
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_ERR_INVALID_ARG
Definition xf_err.h:46
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_BUSY
Definition xf_err.h:52
#define xf_memcpy(dest, src, n)
Definition xf_string.h:44
#define xf_bzero(ptr, size)
Definition xf_string.h:43
static xf_osal_queue_t queue
Definition xf_main.c:35
消息队列对象结构体。
#define XF_LOGE(tag, format,...)
static void copy_data_to_queue(xf_task_queue_t *const queue, const void *item, const bool pos)
static void copy_data_from_queue(xf_task_queue_t *const queue, void *const buffer)
static void move_reader(xf_task_queue_t *const queue)
#define TAG
消息队列。