FIFO学习笔记

    技术2026-08-31  4

    FIFO学习笔记

    2010-11-24root

    思路:定义了一个缓冲区,用缓冲区的头部来存储该缓冲区的起始地址,结束地址,入队的指针和出队的指针等一些信息。

    定义FIFO的结构:

    typedefstruct fifo_t {

            uint8  *start;      // 可用的缓冲区起始地址

            uint8  *end;            // 缓冲区结束地址

            uint8  *in;                  // 数据入口指针

            uint8  *out;            // 数据出口指针

            uint32  size;           // 可用的缓冲区大小

            uint32  entry;         // 进入缓冲区中的总数据

    }FIFO_T;

    定义缓冲区:

           uint8gComDTxBuf[256]

     

    操作该缓冲区:

    FIFO_T *p_fifo;

     

    p_fifo = (FIFO_T *)gComDTxBuf;

     

    p_fifo->start = 0xffffffff;

     

    出现的问题:

    结构中的start 并不等于0xffffffff,而是等于0xffffff

    原因:

    后来发现gComDTxBuf的地址为0x40000579,这个地址不是4字节对齐的,而结存储一个指针需要占用4字节,当给start赋值的时候如果start的地址不是4字节对齐,就会出错。查看内存0x4000578的内容才是0xffffffff,说明给start(地址为0x40000579)赋值的时候实际是从0x40000578地址开始赋值,因为0x40000578这个地址是4字节对齐的。

    解决方法:

    重新定义

           uint8gComDTxBuf[256] __attribute__((aligned (4)));

    这样就保证的gComDTxBuf4字节对齐。

    这时候gComDTxBuf的地址变为0x4000057c,该地址是4字节对齐的。

    __attribute__这个属性是ARM编译器对C语言的扩展,在Keilhelp文档的RealView Compiler Reference Guide->Compiler-specificFeatures->Variable attribute里有介绍。

    最新回复(0)