本文共 1891 字,大约阅读时间需要 6 分钟。
使用需要包含头文件#include <kernel/kififo>
1、创建队列(动态创建)int kfifo_alloc(struct kififo *fifo , unsigned int size , gfp_t gfp_mask);该函数会创建并初始化一个大小为size的fifo,内核使用gfp_mask标识分配队列。成功返回0ep : struct kfifo fifo ; int ret ; //创建一个大小为PAGE_SIZE的队列,由内核进行内存分配 ret = kfifo_allo(&kifo , PAGE_SIZE , GFP_KERNEL); if(ret) return ret ;自己分配缓冲,可以调用: void kfifo_init(struct kfifo *kfifo ,void *buffer , unsigned int size); 创建并初始化一个kfifo对象,它将使由buffer指向的size字节大小的内存 对于以上两个函数,size必须是2的幂。 静态声明: DECLARE_KFIFO(name , size); INIT_KFIFO(name);2、堆入队列数据unsigned int kfifo_in(struct kfifo *fifo , const void *from , unsigned int len);该函数将from指针所指的len字节的数据拷贝到fifo所指向的队列中,成功返回数据字节大小。3、摘取队列数据unsigned int kfifo_out_peek(struct kfifo *fifo , void *to , unsigned int len , unsigned offset);;与kfifo_out类似,如果offset为0,则读队列头,参数offset指向队列中的索引位置。4、获取队列长度//返回存储kfifo队列的空间的总体大小 static inline unsigned int kififo_size(struct kfifo *fifo);//返回队列中已堆入数据的大小 static inline unsigned int kfifo_len(struct kfifo *fifo);//想得到kfifo队列中还有多少可用空间 static inline unsigned int kfifo_avail(struct kififo *fifo);//判断队列是否为空,返回非0值,返回0则相反 static inline int kfifo_is_empty(struct kfifo *fifo);//判断队列是否为满,返回非0值,返回0则相反 static inline int kfifo_is_full(struct kfifo *fifo);5、重置和撤销队列//抛弃所有队列中的内容,调用kfifo_reset();static inline void kfifo_reset(struct kfifo *fifo);//撤销一个还是用kfifo_alloc()分配的队列,调用kfifo_free();使用举例:
unsigned int i ; //将0,31压如名为fifo的kfifo中 for(i = 0 ; i < 32 ; i++) kfifo_in(fifo , &i , sizeof(i)); unsigned int val ; int ret ; ret = kfifo_out_peek(fifo , &val , sizeof(val) , 0); if(ret != sizeof(val)) return -EINVAL ; printk(KERN_INFO"%u\n",val);//应该输出0 //摘取并打印kfifo中的所有元素,可以调用kfifo_out(); //当队列中还有数据时,按顺序从0到31打印出来 while(kfifo_avail(fifo)){ unsigned int ret ; int ret ; ret = kfifo_out(fifo,&val , sizeof(val)); if(ret != sizeof(val)) return -EINVAL ; printk(KERN_INFO"%u\n",val); }
转载地址:http://gcwll.baihongyu.com/