我正在阅读" Linux设备驱动程序3"我无法理解以下代码:
/* How much space is free */
static int spacefree(struct scull_pipe *dev){
if(dev->rp == dev->wp)
return dev->buffersize - 1;
return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;
}
根据我的理解: 1. * buffer是缓冲区的开头。 2. * end是缓冲区的结尾。 3. end = buffer + buffersize 因此, buffersize 是缓冲区的总大小。
if(dev->rp == dev->wp)
return dev->buffersize - 1;
上面的代码是正确的, if 读指针(rp)和写指针(wp)都在缓冲区的开头。因为如果没有数据写入缓冲区,那么写指针(wp)将位于缓冲区的开头(除非写指针(wp)已经包装),因此,可用空间的总量等于缓冲区大小
但是我不确定上面的代码是否正确,如果读指针(rp)和写指针(wp)都指向缓冲区的末尾(或指向缓冲区中间的内存位置) 。如果写指针(wp)指向缓冲区的末尾,则可用空间总量应 0 ,对吗?
return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;
根据我的理解,当读指针(rp)和写指针(wp)不时,上面的代码应返回缓冲区中的可用空间总量>指向缓冲区中的相同内存位置。
是否可以根据写指针(wp)的位置单独计算可用空间总量?
例如:dev-> end - dev-> wp
有人可以解释一下这段代码。
由于
答案 0 :(得分:0)
我终于理解了代码:
如果写指针(wp)出现在读指针后面,则缓冲区已满。
return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;
要理解上面的代码段:
考虑一个包含10个内存位置的循环缓冲区:
8 9 10 | 1 2 3 4 5 6 7
如果读指针(rp)位于内存位置3且写指针位于内存位置7,则5个内存位置是空闲的:
8, 9, 10, 1, 2
插入值:
return ((dev->rp + dev->buffersize - dev->wp) % dev->buffersize) - 1;
return ((3 + 10 - 7) % 10) -1
return ((6) % 10) -1
return 6-1
return 5