代码不重复贴,网上大把,针对比较难理解的几句代码注释下,以备忘:
1、kfifo的size要求是2的N次方,主要是为满足(fifo->in & (fifo->size - 1) ) 等价于(fifo->in % fifo->size)。
2、fifo->in % fifo->size用来求得buffer中的写下标。
3、fifo->size - (fifo->in & (fifo->size - 1))表示写下标到buffer尾还有多少可写空间。
4、min(len, fifo->size - (fifo->in & (fifo->size - 1)))这句的意思是比较要写入数据的长度len与剩余可写空间,求最小值,如果len<可写空间,则直接写入;反之,则要将len拆分写入(见5、6点)。
5、memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l)中的fifo->buffer + (fifo->in & (fifo->size - 1))表示先将fifo->buffer起始地址偏移到写指针位置后,开始写入 l 长度的数据;
6、memcpy(fifo->buffer, buffer + l, len - l)表示剩下len - l 的数据就从fifo->buffer头开始写入,实现循环。
读过程类似,不赘述。