2022-12-31 14:42:31 +00:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>ο<EFBFBD>linux/kfifo)
|
|
|
|
|
*
|
|
|
|
|
* Copyright (c) 2016~2021, <morro_luo@163.com>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*
|
|
|
|
|
* Change Logs:
|
|
|
|
|
* Date Author Notes
|
|
|
|
|
* 2016-05-30 roger.luo Initial version
|
|
|
|
|
* 2021-02-05 roger.luo <EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><EFBFBD>пռ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ӿ<EFBFBD>.
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
#include "ringbuffer.h"
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
|
|
#define min(a,b) ( (a) < (b) )? (a):(b)
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*@brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[in] r - <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[in] buf - <EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[in] len - buf<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|
|
|
|
*@retval bool
|
|
|
|
|
*/
|
|
|
|
|
bool ring_buf_init(ring_buf_t *r,unsigned char *buf, unsigned int len)
|
|
|
|
|
{
|
|
|
|
|
r->buf = buf;
|
|
|
|
|
r->size = len;
|
|
|
|
|
r->front = r->rear = 0;
|
|
|
|
|
return buf != NULL && (len & len -1) == 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*@brief <EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[in] r - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յĻ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@retval none
|
|
|
|
|
*/
|
|
|
|
|
void ring_buf_clr(ring_buf_t *r)
|
|
|
|
|
{
|
|
|
|
|
r->front = r->rear = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*@brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@retval <EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
unsigned int ring_buf_len(ring_buf_t *r)
|
|
|
|
|
{
|
|
|
|
|
return r->rear - r->front;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*@brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пռ<EFBFBD>
|
|
|
|
|
*@retval <EFBFBD><EFBFBD><EFBFBD>пռ<EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
unsigned int ring_buf_free_space(ring_buf_t *r)
|
|
|
|
|
{
|
|
|
|
|
return r->size - (unsigned int)(r->rear - r->front);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*@brief <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[in] buf - <EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* len - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@retval ʵ<EFBFBD>ʷŵ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
unsigned int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len)
|
|
|
|
|
{
|
|
|
|
|
unsigned int i;
|
|
|
|
|
unsigned int left;
|
|
|
|
|
left = r->size + r->front - r->rear;
|
|
|
|
|
len = min(len , left);
|
|
|
|
|
i = min(len, r->size - (r->rear & r->size - 1));
|
|
|
|
|
memcpy(r->buf + (r->rear & r->size - 1), buf, i);
|
|
|
|
|
memcpy(r->buf, buf + i, len - i);
|
|
|
|
|
r->rear += len;
|
|
|
|
|
return len;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*@brief <EFBFBD>ӻ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[in] len - <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@param[out] buf - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*@retval ʵ<EFBFBD>ʶ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
unsigned int ring_buf_get(ring_buf_t *r,unsigned char *buf,unsigned int len)
|
|
|
|
|
{
|
|
|
|
|
unsigned int i;
|
|
|
|
|
unsigned int left;
|
|
|
|
|
if (ring_buf_len(r) == 0)
|
|
|
|
|
return 0;
|
|
|
|
|
left = r->rear - r->front;
|
|
|
|
|
len = min(len , left);
|
|
|
|
|
i = min(len, r->size - (r->front & r->size - 1));
|
|
|
|
|
memcpy(buf, r->buf + (r->front & r->size - 1), i);
|
|
|
|
|
memcpy(buf + i, r->buf, len - i);
|
|
|
|
|
r->front += len;
|
|
|
|
|
return len;
|
|
|
|
|
}
|