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的读写操作也需要考虑指针越界的情况。
读操作是正常的读,无论是读还是写,我们要注意读写指针越界要取余的情况,也就是当越界的时候要分片段操作。
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的读写操作也需要考虑指针越界的情况。
相关文章推荐
- Linux定时任务Crontab详解
- Linux脚本中用户自定义终止符-<<EOF
- 详解Linux中SSH远程访问控制
- linux定时器
- linux nice命令: 设置进程优先级
- Linux下 /proc文件夹内容解析(/proc文件系统解析)
- 每天一个linux命令(23):Linux 目录结构
- Linux命令
- Linux 技巧:让进程在后台可靠运行的几种方法nohup|
- CentOs安装Scrapy出现error: Setup script exited with error: command ‘gcc’ failed with exit status 1错误解决方案
- How to Add a User and Grant Root Privileges on CentOS 6.5
- centos下lamp环境快速搭建
- netstat命令, netstat指令在windows和linux有什么不同
- netstat命令, netstat指令在windows和linux有什么不同
- 一、概览linux spi驱动子系统
- Linux学习--命令(1)
- linux时钟同步
- [转] linux虚拟带库操作笔记
- [转] 在Linux平台使用mhVTL虚拟化磁带库
- linux常用命令汇总