JZring.c
6.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
#include <string.h>
#include <pthread.h> // 添加线程互斥锁支持
#include "JZring.h"
typedef struct T_JZring
{
U8_t *buffer; // 缓冲区指针
U32_t size; // 缓冲区总容量
U32_t head; // 写入位置(下一个可写位置)
U32_t tail; // 读取位置(下一个可读位置)
U32_t count; // 当前数据量
pthread_mutex_t mutex; // 互斥锁保护共享资源
} T_JZring;
// 初始化环形缓冲区
T_JZsdkReturnCode JZring_Init(T_JZringHandle *ring, U8_t *buffer, U32_t size)
{
if (!ring || !buffer || size == 0)
{
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)malloc(sizeof(T_JZring));
if (!r) {
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
// 初始化互斥锁
if (pthread_mutex_init(&r->mutex, NULL) != 0) {
free(r);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
r->buffer = buffer;
r->size = size;
r->head = 0;
r->tail = 0;
r->count = 0;
*ring = (T_JZringHandle)r;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 获取缓冲区总容量
T_JZsdkReturnCode JZring_GetSize(T_JZringHandle ring, U32_t *size)
{
if (!ring || !size) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
*size = r->size;
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 获取当前数据量
T_JZsdkReturnCode JZring_GetDataCount(T_JZringHandle ring, U32_t *count)
{
if (!ring || !count) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
*count = r->count;
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 从环形缓冲区读取数据
T_JZsdkReturnCode JZring_Read(T_JZringHandle ring, U8_t *data, U32_t size, U32_t *readSize)
{
if (!ring || !data || !readSize) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
*readSize = 0;
pthread_mutex_lock(&r->mutex);
if (r->count == 0 || size == 0) {
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 计算实际可读数量
U32_t bytes_to_read = (size > r->count) ? r->count : size;
*readSize = bytes_to_read;
// 计算连续可读空间(可能被尾部分割)
U32_t contig = r->size - r->tail;
if (bytes_to_read <= contig) {
memcpy(data, r->buffer + r->tail, bytes_to_read);
} else {
memcpy(data, r->buffer + r->tail, contig);
memcpy(data + contig, r->buffer, bytes_to_read - contig);
}
// 更新读指针和数据计数
r->tail = (r->tail + bytes_to_read) % r->size;
r->count -= bytes_to_read;
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 写入数据到环形缓冲区
T_JZsdkReturnCode JZring_Write(T_JZringHandle ring, const U8_t *data, U32_t size)
{
if (!ring || !data) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
if (size == 0) {
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
// 直接检查可用空间
if (size > (r->size - r->count))
{
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_BUFFER_SIZE_NOT_ENOUGH;
}
// 计算连续可写空间(可能被尾部分割)
U32_t contig = r->size - r->head;
if (size <= contig) {
memcpy(r->buffer + r->head, data, size);
} else {
memcpy(r->buffer + r->head, data, contig);
memcpy(r->buffer, data + contig, size - contig);
}
// 更新写指针和数据计数
r->head = (r->head + size) % r->size;
r->count += size;
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 获取空闲空间
T_JZsdkReturnCode JZring_GetFreeSpace(T_JZringHandle ring, U32_t *size)
{
if (!ring || !size) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
*size = r->size - r->count;
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 检查缓冲区是否为空
T_JZsdkReturnCode JZring_IsEmpty(T_JZringHandle ring, bool *isEmpty)
{
if (!ring || !isEmpty) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
*isEmpty = (r->count == 0);
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 检查缓冲区是否已满
T_JZsdkReturnCode JZring_IsFull(T_JZringHandle ring, bool *isFull)
{
if (!ring || !isFull) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
*isFull = (r->count == r->size);
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 重置环形缓冲区
T_JZsdkReturnCode JZring_Reset(T_JZringHandle ring)
{
if (!ring) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
pthread_mutex_lock(&r->mutex);
r->head = 0;
r->tail = 0;
r->count = 0;
pthread_mutex_unlock(&r->mutex);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
// 反初始化环形缓冲区
T_JZsdkReturnCode JZring_DeInit(T_JZringHandle ring)
{
if (!ring) {
return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
T_JZring *r = (T_JZring*)ring;
// 销毁互斥锁
pthread_mutex_destroy(&r->mutex);
// 释放管理结构体
free(r);
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}