前言
kfifo巧妙的运用了无符号变量和位运算的特点。使得代码巧妙。
数据结构
struct kfifo {
unsigned char *buffer; /* 存放数据的buff */
unsigned int size; /* 分配到的buff的大小 */
unsigned int in; /* data写入时的偏移量 (in % size) */
unsigned int out; /* data is extracted from off. (out % size) */
};
初始化
对于kfifo的初始化分为两种,静态初始化和动态初始化。
在初始化中,我们会发现,它分配的buffer大小一定是2的幂次数,如果参数不是2的幂次数,会进行向上取舍。为什么这么设计呢?先放个悬念。其中_kfifo_init(fifo, buffer, size)是分配内存和设置参数的函数调用。
/** 静态初始化:使用一个预分配好的buffer进行初始化一个kfifo */
void kfifo_init(struct kfifo *fifo, void *buffer, unsigned int size)
{
/* size must be a power of 2 */
BUG_ON(!is_power_of_2(size));
_kfifo_init(fifo, buffer, size);
}
/* 分配一个size大小的fifo **/
int kfifo_alloc