8#define CLOCKS_PER_SEC 320000000
12#define MIN(a,b) ((a) > (b) ? (b) : (a))
14#define RING_BUFFER_DECLARED 0xDEC1A8ED
15#define RING_BUFFER_ALLOCATED 0xA10CA7ED
16#define RING_BUFFER_MEM_ERROR 0xDEADF00D
17#define RING_BUFFER_ERROR 0xBEDABEDA
18#define RING_BUFFER_OK 0x0
20#define EXIT_ON_TIMEOUT 1
21#define EXIT_ON_COMPLETED 0
22#define EXIT_ON_FULL_BUFFER 2
23#define EXIT_ON_EMPTY_BUFFER 2
26#define bytesizeof(T) (sizeof(T)<<2)
28#define bytesizeof(T) sizeof(T)
31typedef void *(*memcpy_ptr)(
void *,
void const *, size_t) ;
32typedef void *(*t_bytecpy)(
void *to,
int toIndex,
void const *from,
int fromIndex,
size_t size) ;
43 t_bytecpy push_memcpy;
55 int pad[16-3-5*
sizeof(memcpy_ptr)/
sizeof(
int)];
58 void Sleep(clock_t msec ){
60 clock_t dt=msec*(CLOCKS_PER_SEC/1000);
65 rep 32 with afifo and afifo;
66 rep 32 with afifo and afifo;
67 rep 32 with afifo and afifo;
68 rep 32 with afifo and afifo;
69 rep 32 with afifo and afifo;
70 rep 32 with afifo and afifo;
71 rep 32 with afifo and afifo;
72 rep 32 with afifo and afifo;
88 C_RingBuffer(T* buffer,
size_t count, t_bytecpy pushmemcpy, t_bytecpy popmemcpy ){
89 Init(buffer,count,pushmemcpy,popmemcpy);
92 bool Init(T* buffer,
size_t count, t_bytecpy pushmemcpy, t_bytecpy popmemcpy ){
93 if (buffer==0)
return false;
94 if (count&(count-1)!=0)
return false ;
102 push_memcpy=(t_bytecpy)pushmemcpy;
103 pop_memcpy =(t_bytecpy)popmemcpy;
115 __INLINE__
bool IsFull(){
118 __INLINE__
bool IsEmpty(){
121 __INLINE__
size_t PushAvail(){
124 __INLINE__
size_t PopAvail(){
133 T* pElement=
data+headPointer;
140 T* pElement=
data+tailPointer;
144 bool MoveHead(
int numElements){
145 size_t h=
head+numElements;
147 return RING_BUFFER_ERROR;
149 return RING_BUFFER_OK;
152 bool MoveTail(
int numElements){
153 size_t t=
tail+numElements;
155 return RING_BUFFER_ERROR;
157 return RING_BUFFER_OK;
161 size_t Push(T* pSrcElements,
size_t numElements,
int ExitMode= EXIT_ON_COMPLETED)
163 size_t initHead=
head;
171 size_t posTail=Tail&(
size-1);
172 if (posTail<posHead ||
head==Tail)
174 else if (posHead<posTail)
175 diff=posTail-posHead;
176 else if (ExitMode&EXIT_ON_FULL_BUFFER)
177 return (
head-initHead);
178 else if (ExitMode&EXIT_ON_TIMEOUT){
179 if ((clock()-t0)>timeout*(CLOCKS_PER_SEC/1000))
180 return (
head-initHead);
188 count=MIN(numElements,diff);
189 if (push_memcpy(
data,posHead*bytesizeof(T),pSrcElements,posSrc*bytesizeof(T),count*bytesizeof(T))){
195 return (
head-initHead);
198 size_t Push(T pSrcElement)
200 return Push(&pSrcElement,1,EXIT_ON_COMPLETED);
214 else if (posHead<posTail)
215 diff=posTail-posHead;
221 dma_ptr =pSrcElements;
222 dma_left =numElements;
223 dma_size =MIN(dma_left,diff);
227 bool isPushCompleted()
250 size_t Pop(T* pDstElements,
size_t numElements,
int ExitMode= EXIT_ON_COMPLETED)
252 size_t initTail=
tail;
259 size_t posHead=Head&(
size-1);
261 if (posTail<posHead )
262 diff=posHead-posTail;
263 else if (posHead<=posTail && Head!=
tail)
265 else if (ExitMode&EXIT_ON_EMPTY_BUFFER)
266 return (
tail-initTail);
267 else if (ExitMode&EXIT_ON_TIMEOUT){
268 if ((clock()-t0)>timeout)
269 return (
tail-initTail);
277 count=MIN(numElements,diff);
278 pop_memcpy(pDstElements,posDst*bytesizeof(T),
data,posTail*bytesizeof(T),count*bytesizeof(T));
283 return (
tail-initTail);
Definition: ringbuffer_.h:33
int pad[16-3-5 *sizeof(memcpy_ptr)/sizeof(int)]
резервные поля
Definition: ringbuffer_.h:55
void PushRequest(T *pSrcElements, size_t numElements)
Definition: ringbuffer_.h:203
size_t size
размер кольцевого буфера входных данных (в элементах; гарантируется что это степень двойки)
Definition: ringbuffer_.h:36
size_t tail
сколько элементов ОТ НАЧАЛА ПОТОКА код SLAVE уже прочитал (обработал) [заполняется SLAVE]
Definition: ringbuffer_.h:38
size_t head
сколько элементов ОТ НАЧАЛА ПОТОКА код MASTER уже записал в буфер входных данных [заполняется MASTER]
Definition: ringbuffer_.h:37
T * data
физический адрес кольцевого буфера входных данных
Definition: ringbuffer_.h:35