欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kfifo

程序员文章站 2022-03-22 20:22:59
...

在驱动编程中,经常会遇到异步数据处理的情况,比如采用中断或定时器处理数据输入输出等情况

此时数据的采集与处理往往不同步,于是驱动编程中数据采集方需要将采集的数据暂时放到一个缓冲区中,使用方在需要处理数据时从缓冲区中将数据读出

驱动编程中常采用队列这种数据结构来实现整个过程,我们可以选择自己编写一个队列,也可以利用内核中现有队列kfifo来实现

kfifo 

 

#include <linux/kfifo.h>		    //头文件包含

//kfifo结构体类型
struct kfifo {
 unsigned char *buffer;	     //存放数据的缓存区	
 unsigned int size;	             //buffer空间大小
 unsigned int in;		     //指向buffer队头
 unsigned int out;	             //指向buffer队尾
};

//为fifo分配size大小的内存空间,返回0表示成功
	int kfifo_alloc(struct kfifo *fifo,
		unsigned int size, gfp_t gfp_mask);
	参数1:kfifo类型变量地址
	参数2:分配内存空间的大小(单位字节)
	参数3:GFP_KERNEL (申请内存标志位)
typedef enum {
	GFP_KERNEL,    //在分配内存的时候,可以参与进程调度,在分配过程中可以被打断	
   GFP_ATOMIC,    //原子操作
} gfp_t;
//释放创建的FIFO
void kfifo_free(struct kfifo *fifo);

//将数据放入kfifo内,返回值为实际写入的数据长度
unsigned int kfifo_in(struct kfifo *fifo, \
		          const void *from,unsigned int len)
//从kfifo读取数据,返回值为实际读出的数据长度
unsigned int kfifo_out(struct kfifo *fifo, \
				   void *to, unsigned int len)
	参数1:用户定义的kfifo
	参数2:读写数据的首地址
	参数3:读写数据的大小

//获取kfifo内的已用数据个数
unsigned int kfifo_len(struct kfifo *fifo)
//获取fifo总大小
unsigned int kfifo_size(struct kfifo *fifo)
//检查kfifo是否为空
int kfifo_is_empty(struct kfifo *fifo)
//检查kfifo是否为满
int kfifo_is_full(struct kfifo *fifo)

 

//内核提供的内存分配函数
//特点:分配出来的空间,在虚拟内存上连续,在物理内存上也是连续的
void *kmalloc(size_t s, gfp_t gfp)
功能:在内核中使用的分配内存函数,分配的内存在内核空间中的低端地址上
参数:
    @s     大小
    @gfp   GFP_KERNEL   GFP_ATOMIC  
返回值:成功返回分配到的空间地址,失败返回NULL

void kfree(void *p)    

//分配的内存在内核空间中的高端地址上,在虚拟内存上连续,在物理内存上不一定连续
void *vmalloc(unsigned long size);
void vfree(void *ptr);

 

相关标签: 驱动程序