#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__ */