#ifndef __MY_FIFO_H__
#define __MY_FIFO_H__
#ifndef MY_FIFO_FULL
#define MY_FIFO_FULL(fifo)
#endif
#ifndef MY_FIFO_EMPTY
#define MY_FIFO_EMPTY(fifo)
#endif
#ifndef MY_FIFO_LOCK
#define MY_FIFO_LOCK(fifo)
#endif
#ifndef MY_FIFO_UNLOCK
#define MY_FIFO_UNLOCK(fifo)
#endif
/*创建*/
#define CREAT_MY_FIFO(fifo,type,size) \
type fifo[size]; \
type *fifo##_in = fifo; \
type *fifo##_out = fifo;
/* 声明*/
#define DECLARE_MY_FIFO(fifo,type,size) \
extern type fifo[size]; \
extern type *fifo##_in; \
extern type *fifo##_out
/* 初始化*/
#define INIT_MY_FIFO(fifo,size) \
do { \
fifo##_in = fifo; \
fifo##_out = fifo; \
} while(0)
/*写*/
#define MY_FIFO_IN(fifo,data,type) \
do { \
MY_FIFO_LOCK(fifo); \
*(fifo##_in++) = data; \
if (fifo##_in >= fifo + sizeof(fifo) / sizeof(type)) \
fifo##_in = fifo; \
if (fifo##_in == fifo##_out) { \
MY_FIFO_FULL(fifo); \
if (fifo##_in-- == fifo) \
fifo##_in = fifo + sizeof(fifo) / sizeof(type) - 1; \
} \
MY_FIFO_UNLOCK(fifo); \
} while(0)
/* 读*/
#define MY_FIFO_OUT(fifo,data,type) \
do { \
MY_FIFO_LOCK(fifo); \
if (fifo##_in == fifo##_out) { \
MY_FIFO_EMPTY(fifo); \
} \
else { \
*data = *(fifo##_out++); \
if (fifo##_out >= fifo + sizeof(fifo) / sizeof(type)) \
fifo##_out = fifo; \
} \
MY_FIFO_UNLOCK(fifo); \
} while(0)
/*
*²âÊÔÀý³Ì
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
CREAT_MY_FIFO(test_fifo0,u8,7);
CREAT_MY_FIFO(test_fifo1,u16,7);
CREAT_MY_FIFO(test_fifo2,u32,7);
struct fifo_offset{
u8 a0;
u8 a1;
u8 a2;
u8 a3;
};
union fifo_test{
struct fifo_offset offset;
u32 data32;
u16 data16;
};
void check_fifo (void)
{
u8 i;
union fifo_test fifo;
for (i = 0;i < 8;i++) {
fifo.offset.a0 = (i+'0');
fifo.offset.a1 = (i+1+'0');
fifo.offset.a2 = (i+2+'0');
fifo.offset.a3 = (i+3+'0');
MY_FIFO_IN(test_fifo0,fifo.offset.a0,u8);
MY_FIFO_IN(test_fifo1,fifo.data16,u16);
MY_FIFO_IN(test_fifo2,fifo.data32,u32);
}
puts("u8 u16 u32\r\n");
for (i = 0;i < 8;i++) {
fifo.data32 = 0X40404040;
MY_FIFO_OUT(test_fifo0,&(fifo.data32),u8);
putchar((fifo.offset.a0));
puts(" ");
fifo.data32 = 0X40404040;
MY_FIFO_OUT(test_fifo1,&(fifo.data32),u16);
putchar((fifo.offset.a0));
putchar((fifo.offset.a1));
puts(" ");
fifo.data32 = 0X40404040;
MY_FIFO_OUT(test_fifo2,&(fifo.data32),u32);
putchar((fifo.offset.a0));
putchar((fifo.offset.a1));
putchar((fifo.offset.a2));
putchar((fifo.offset.a3));
putchar('\r');
putchar('\n');
}
putchar('\r');
putchar('\n');
}
*/
#endif /* __MY_FIFO_H__ */