Описание библиотеки микросхемы 5023ВС016 процессора "Спутник"
ringbuffer.c
См. документацию.
1 
29 #include "ringbuffer.h"
30 
31 
40 void RingBuffer_Init(RINGBUFF_T *RingBuff, void *buffer, int itemSize, int count)
41 {
42  RingBuff->data = buffer;
43  RingBuff->count = count;
44  RingBuff->itemSz = itemSize;
45  RingBuff->head = RingBuff->tail = 0;
46 }
47 
48 
55 Status RingBuffer_Insert(RINGBUFF_T *RingBuff, const void *data)
56 {
57  uint8_t *ptr = RingBuff->data;
58  /* Проверка на наличие свободного места в буфере */
59  if (RingBuffer_IsFull(RingBuff))
60  {
61  return ERROR;
62  }
63  ptr += RB_INDH(RingBuff) * RingBuff->itemSz;
64  memcpy(ptr, data, RingBuff->itemSz);
65  RingBuff->head++;
66 
67  return SUCCESS;
68 }
69 
77 int RingBuffer_InsertMult(RINGBUFF_T *RingBuff, const void *data, int num)
78 {
79  uint8_t *ptr = RingBuff->data;
80  int cnt1, cnt2;
81 
82  /* Проверка на наличие свободного места в буфере */
83  if (RingBuffer_IsFull(RingBuff))
84  {
85  return (int)ERROR;
86  }
87 
88  /* Вычисление длины сегментов */
89  cnt1 = cnt2 = RingBuffer_GetFree(RingBuff);
90  if (RB_INDH(RingBuff) + cnt1 >= RingBuff->count)
91  {
92  cnt1 = RingBuff->count - RB_INDH(RingBuff);
93  }
94  cnt2 -= cnt1;
95  cnt1 = MIN(cnt1, num);
96  num -= cnt1;
97  cnt2 = MIN(cnt2, num);
98  num -= cnt2;
99 
100  /* Запись сегмента 1 */
101  ptr += RB_INDH(RingBuff) * RingBuff->itemSz;
102  memcpy(ptr, data, cnt1 * RingBuff->itemSz);
103  RingBuff->head += cnt1;
104 
105  /* Запись сегмента 2 */
106  ptr = (uint8_t *) RingBuff->data + RB_INDH(RingBuff) * RingBuff->itemSz;
107  data = (const uint8_t *) data + cnt1 * RingBuff->itemSz;
108  memcpy(ptr, data, cnt2 * RingBuff->itemSz);
109  RingBuff->head += cnt2;
110 
111  return cnt1 + cnt2;
112 }
113 
120 Status RingBuffer_Pop(RINGBUFF_T *RingBuff, void *data)
121 {
122  uint8_t *ptr = RingBuff->data;
123  /* Проверка кольцевого буфера на отсутствие данных */
124  if (RingBuffer_IsEmpty(RingBuff))
125  {
126  return ERROR;
127  }
128  ptr += RB_INDT(RingBuff) * RingBuff->itemSz;
129  memcpy(data, ptr, RingBuff->itemSz);
130  RingBuff->tail++;
131 
132  return SUCCESS;
133 }
134 
142 int RingBuffer_PopMult(RINGBUFF_T *RingBuff, void *data, int num)
143 {
144  uint8_t *ptr = RingBuff->data;
145  int cnt1, cnt2;
146 
147  /* Проверка кольцевого буфера на отсутствие данных */
148  if (RingBuffer_IsEmpty(RingBuff))
149  {
150  return (int)ERROR;
151  }
152 
153  /* Вычисление длины сегментов */
154  cnt1 = cnt2 = RingBuffer_GetCount(RingBuff);
155  if (RB_INDT(RingBuff) + cnt1 >= RingBuff->count)
156  {
157  cnt1 = RingBuff->count - RB_INDT(RingBuff);
158  }
159  cnt2 -= cnt1;
160  cnt1 = MIN(cnt1, num);
161  num -= cnt1;
162  cnt2 = MIN(cnt2, num);
163  num -= cnt2;
164 
165  /* Чтение сегмента 1 */
166  ptr += RB_INDT(RingBuff) * RingBuff->itemSz;
167  memcpy(data, ptr, cnt1 * RingBuff->itemSz);
168  RingBuff->tail += cnt1;
169 
170  /* Чтение сегмента 2 */
171  ptr = (uint8_t *) RingBuff->data + RB_INDT(RingBuff) * RingBuff->itemSz;
172  data = (uint8_t *) data + cnt1 * RingBuff->itemSz;
173  memcpy(data, ptr, cnt2 * RingBuff->itemSz);
174  RingBuff->tail += cnt2;
175 
176  return cnt1 + cnt2;
177 }
178 
185 {
186  return RingBuff->count;
187 }
188 
195 {
196  return RB_VHEAD(RingBuff) - RB_VTAIL(RingBuff);
197 }
198 
205 {
206  return RingBuff->count - RingBuffer_GetCount(RingBuff);
207 }
208 
215 {
216  return (RingBuffer_GetCount(RingBuff) >= RingBuff->count);
217 }
218 
225 {
226  return RB_VHEAD(RingBuff) == RB_VTAIL(RingBuff);
227 }
228 
int itemSz
Definition: ringbuffer.h:43
Этот файл содержит структуры, макросы и функции необходимые для взаимодействия с кольцевыми буферами...
uint32_t count
Definition: timer_test.c:35
Definition: types.h:76
int RingBuffer_GetSize(RINGBUFF_T *RingBuff)
Получение размера кольцевого буфера в байтах.
Definition: ringbuffer.c:184
uint32_t tail
Definition: ringbuffer.h:45
#define RB_INDT(gl_rb_t)
Definition: ringbuffer.h:52
Status RingBuffer_Insert(RINGBUFF_T *RingBuff, const void *data)
Запись одного элемента в кольцевой буфер.
Definition: ringbuffer.c:55
int RingBuffer_IsFull(RINGBUFF_T *RingBuff)
Проверка на наличие свободного места в кольцевом буфере
Definition: ringbuffer.c:214
Definition: types.h:76
#define RB_INDH(gl_rb_t)
Макросы для работы с кольцевыми буферами
Definition: ringbuffer.h:51
int RingBuffer_GetCount(RINGBUFF_T *RingBuff)
Получения количества элементов, записанных в кольцевой буфер.
Definition: ringbuffer.c:194
#define RB_VTAIL(gl_rb_t)
Definition: ringbuffer.h:54
int RingBuffer_PopMult(RINGBUFF_T *RingBuff, void *data, int num)
Чтение массива элементов из кольцевого буфера
Definition: ringbuffer.c:142
int RingBuffer_GetFree(RINGBUFF_T *RingBuff)
Получение размера свободного места в кольцевом буфере
Definition: ringbuffer.c:204
Структура кольцевого буфера
Definition: ringbuffer.h:39
#define MIN(a, b)
Definition: types.h:48
#define RB_VHEAD(gl_rb_t)
Definition: ringbuffer.h:53
int RingBuffer_IsEmpty(RINGBUFF_T *RingBuff)
Проверка кольцевого буфера на отсутствие данных
Definition: ringbuffer.c:224
void RingBuffer_Init(RINGBUFF_T *RingBuff, void *buffer, int itemSize, int count)
Инициализация кольцевого буфера.
Definition: ringbuffer.c:40
uint32_t head
Definition: ringbuffer.h:44
void * data
Definition: ringbuffer.h:41
Status
Тип для статуса операции
Definition: types.h:76
Status RingBuffer_Pop(RINGBUFF_T *RingBuff, void *data)
Чтение одного элемента из кольцевого буфера
Definition: ringbuffer.c:120
int RingBuffer_InsertMult(RINGBUFF_T *RingBuff, const void *data, int num)
Запись нескольких элементов в кольцевой буфер.
Definition: ringbuffer.c:77