Linux驱动开发杂记(0x14) - 环形缓冲区circ_buf


/*
 * 在内核<linux/circ_buf.h>中定义了关于环形缓冲区的相关变量。
 * 其中缓冲区的大小size必须定义成2的n次方,这样可以将取余运算转换成位与运算,
 * 提高计算机的处理速度。例如:x % size = x & (size - 1)。实际可用的空间为size-1,
 * 这样可以避免缓冲区为满时和为空时都满足head = tail。
*/
struct circ_buf {
	char *buf;	// 指向分配缓冲区起始地址的指针
	int head;   // 指向生产者向缓冲区放入数据的位置
	int tail;  	// 指向消费者从缓冲区取走数据的位置
};

/* Return count in buffer.  */
/* 计算缓冲区中有效数据的大小; */
#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))

/* Return space available, 0..size-1.  We always leave one free char
   as a completely full buffer has head == tail, which is the same as
   empty.  */
/* 计算缓冲区剩余空闲空间的大小; */
#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))

/* Return count up to the end of the buffer.  Carefully avoid
   accessing head and tail more than once, so they can change
   underneath us without returning inconsistent results.  */
/* 计算tail到缓冲区尾部的数据大小,即一次性可以读取的数据大小;*/
#define CIRC_CNT_TO_END(head,tail,size) \
	({int end = (size) - (tail); \
	  int n = ((head) + end) & ((size)-1); \
	  n < end ? n : end;})

/* Return space available up to the end of the buffer.  */
/* 计算head到缓冲区尾部的剩余空间,即一次性可以写入的数据大小; */
#define CIRC_SPACE_TO_END(head,tail,size) \
	({int end = (size) - 1 - (head); \
	  int n = (end + (tail)) & ((size)-1); \
	  n <= end ? n : end+1;})

文章作者: Vinx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Vinx !
 上一篇
Linux驱动开发杂记(0x15) - tasklet Linux驱动开发杂记(0x15) - tasklet
  为了提高系统的响应能力和并发能力,Linux将中断处理分了上半部和下半部。当一个中断产生,调用该中断对应的处理程序(上半部),然后告诉系统,对应的后半部可以执行了,中断处理程序立即返回,下半部会在合适的时机由操作系统调用。这样一来就大大
下一篇 
Linux驱动开发杂记(0x13) - 串口UART驱动API Linux驱动开发杂记(0x13) - 串口UART驱动API
串口驱动API ## 1、uart_register_driver /* 功能: uart_register_driver用于将串口驱动uart_driver注册到内核(串口核心层)中,通常在模块初始化函数调用该函数。 * 参数
  目录