zoukankan      html  css  js  c++  java
  • 环形FIFO

    #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__ */
  • 相关阅读:
    [歌词]世界末日
    AJAX是什么?
    [转]Moving Your Access 2002 Database to SQL Server
    .net from身份验证的配置介绍
    ajax
    cmd常用命令
    查看端口解除端口占用
    好久没进来了,今天发一个原创的DatePicker
    真倒霉,前不久分區表錯誤把我數據全部搞沒了
    DataGrid利用DataView过滤,排序
  • 原文地址:https://www.cnblogs.com/worldsing/p/3071708.html
Copyright © 2011-2022 走看看