您的位置:首页 > 运维架构 > Linux

VxWorks的环形缓冲区和linux的环形缓冲区的区别

2015-06-17 09:30 351 查看
在VxWorks中,环形缓冲区使用一个数组实现,其大小比我们预申请的大小大1,这个字节永远都是空出来的,也就是缓冲区不会满。当只有一个字节的时候就写不下了。所以在写操作的时候,不会存在写指针和读指针相等的问题。也就是写操作和读操作不会冲突。也就是不用判断两个指针相同的时候是写满了还是空的。

读操作是正常的读,无论是读还是写,我们要注意读写指针越界要取余的情况,也就是当越界的时候要分片段操作。

VxWorks中的环形缓冲区不像linux那样,linux环形缓冲区的大小是2的幂次方,由于这个特性,我们不需要对读写指针进行取余操作。利用无符号整数的溢出为零的特性就好。这样也就和VxWorks解决了同样的问题,他们的读写指针相同的时候只有一种情况,那就是读完了,写满是不会有任何问题的,写满的时候两者是不相等的。他们两者都解决了怎么判断是读空还是写满的问题。

在linux中,由于缓冲区的大小是2的幂次方,所以其的取模操作可以简单地做成位与操作,由于取模操作的运算时间远大于位与操作,这也是一个优化的方面。

前面讲到fifo->size已经2的次幂圆整,而且kfifo->in % kfifo->size 可以转化为 kfifo->in & (kfifo->size – 1),所以fifo->size - (fifo->in & (fifo->size - 1)) 即位
fifo->in 到 buffer末尾所剩余的长度,l取len和剩余长度的最小值,即为需要拷贝l 字节到fifo->buffer + fifo->in的位置上。


linux的读写操作也需要考虑指针越界的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: