现在的位置: 首页 > 综合 > 正文

环形FIFO

2012年09月14日 ⁄ 综合 ⁄ 共 2144字 ⁄ 字号 评论关闭
#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__ */

抱歉!评论已关闭.