FIFO学习笔记
2010-11-24-root
思路:定义了一个缓冲区,用缓冲区的头部来存储该缓冲区的起始地址,结束地址,入队的指针和出队的指针等一些信息。
定义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)));
这样就保证的gComDTxBuf是4字节对齐。
这时候gComDTxBuf的地址变为0x4000057c,该地址是4字节对齐的。
__attribute__这个属性是ARM编译器对C语言的扩展,在Keil的help文档的RealView Compiler Reference Guide->Compiler-specificFeatures->Variable attribute里有介绍。