FIFO学习笔记

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里有介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值