|
发表于 2016-9-26 15:27:10
|
显示全部楼层
/**
* @brief
*
* @param fifo 缓冲区的数据结构
* @param buffer
* @param size 缓冲区的大小
*/
void kfifo_init(struct kfifo *fifo, void *buffer, unsigned int size)
{
/*housir: 检查时候是2的指数倍 */
if (size & (size - 1))
{
size = roundup_pow_of_two(size);
}
fifo->buffer = buffer;
fifo->size = size;
fifo->in = fifo->out = 0;
}
/**
* @brief 加入缓冲队列
*
* @param fifo
* @param from
* @param len
*
* @return 实际放入缓冲区的长度(可能小于len或者为0)
*/
unsigned int kfifo_in(struct kfifo *fifo, const void *from, unsigned int len)
{
unsigned int l, off;
/*housir: min(大小 - 已经用了的 , len) 计算剩余可用空间 好代码 */
len = min(fifo->size - (fifo->in - fifo->out), len);
/*计算索引(0 ... size-1)*/
off = (fifo->in + 0) & (fifo->size - 1);/*==> (in+0) % size*/
/*housir: 分成2段,1.当前位置到size-1 2.0到0或者0到len-l(剩余的) */
l = min(len, fifo->size - off);
memcpy(fifo->buffer + off, from, l);
/*housir: 将剩余的copy到buffer,如果len == l则啥也不干,好代码 */
memcpy(fifo->buffer, (char *) from + l, len - l);
fifo->in += len;
return len;
}
/**
* @brief
*
* @param fifo
* @param to
* @param len
*
* @return 实际读出缓冲区的长度(可能小于len,或者为0)
*/
unsigned int kfifo_out(struct kfifo *fifo, void *to, unsigned int len)
{
unsigned int out, off;
unsigned int l;
/*housir:验证len是否大于缓冲区存的值 */
len = min(fifo->in - fifo->out, len);
off = (fifo->out + 0) & (fifo->size - 1);/*==> (out+0) % size*/
/* first get the data from fifo->out until the end of the buffer */
l = min(len, fifo->size - off);
memcpy(to, fifo->buffer + off, l);
/* then get the rest (if any) from the beginning of the buffer */
memcpy((char *) to + l, fifo->buffer, len - l);
fifo->out += len;
return len;
} |
|