📄 r_buf.c
字号:
///////////////////////////////////////////////////////////////////////////////
// R_buf.c
// Xie Jingbo
// V1.2
// 2005-9-7
// Ring queue buffer operation program.Independence platform.
///////////////////////////////////////////////////////////////////////////////
#include "r_buf.h"
#include "..\device\driver.h"
///----------------------------------------------------------------------------
// Ring buffer init functin.
///----------------------------------------------------------------------------
bool RbInit(pR_buf rb, uchar *pBuf, uint bLen)
{
if (rb == NULL || pBuf == NULL || bLen < 1)
{
return FALSE;
}
OS_DISABLE_INT(); //Close all interrupt
rb->head = 0;
rb->end = 0;
rb->buf = pBuf;
rb->RbLen = bLen;
OS_ENABLE_INT(); //Open all interrupt
return TRUE;
}
///----------------------------------------------------------------------------
// Ring buffer reinit functin.
///----------------------------------------------------------------------------
bool RbReinit(pR_buf rb)
{
if (rb == NULL)
{
return FALSE;
}
OS_DISABLE_INT();
rb->head = 0;
rb->end = 0;
OS_ENABLE_INT();
return TRUE;
}
///----------------------------------------------------------------------------
// Insert one data to ring buf.
///----------------------------------------------------------------------------
bool RbPush(pR_buf rb, uchar val)
{
if (RbFull(rb))
{
return FALSE;
}
OS_DISABLE_INT();
rb->buf[rb->head] = val;
rb->head = (rb->head + 1) % rb->RbLen;
OS_ENABLE_INT();
return TRUE;
}
///----------------------------------------------------------------------------
// Remove one data from ring buf.
///----------------------------------------------------------------------------
bool RbPop(pR_buf rb, uchar *val)
{
if (RbEmpty(rb))
{
return FALSE;
}
OS_DISABLE_INT();
*val = rb->buf[rb->end];
rb->end = (rb->end + 1) % rb->RbLen;
OS_ENABLE_INT();
return TRUE;
}
///----------------------------------------------------------------------------
// Insert some data to ring buf.
///----------------------------------------------------------------------------
bool RbInsrt(pR_buf rb, uchar *in, int inLen)
{
if (rb == NULL || in == NULL || inLen > RbGetFree(rb))
{
return FALSE;
}
OS_DISABLE_INT();
while(inLen--)
{
rb->buf[rb->head] = *in++;
rb->head = (rb->head + 1) % rb->RbLen;
}
OS_ENABLE_INT();
return TRUE;
}
///----------------------------------------------------------------------------
// Remove some data from ring buf.
///----------------------------------------------------------------------------
bool RbRemove(pR_buf rb, uchar *out, int outLen)
{
if (rb == NULL || out == NULL || outLen > RbGetDatLen(rb))
{
return FALSE;
}
OS_DISABLE_INT();
while(outLen--)
{
*out++ = rb->buf[rb->head];
rb->end = (rb->end + 1) % rb->RbLen;
}
OS_ENABLE_INT();
return TRUE;
}
///----------------------------------------------------------------------------
// Search one char from ring buf.
///----------------------------------------------------------------------------
int RbSearch(pR_buf rb, uchar ch, bool newSearch)
{
static uint t_end = 0;
if (rb == NULL)
{
return -1;
}
if (newSearch)
{
t_end = rb->end;
}
OS_DISABLE_INT();
while((t_end != rb->head) && (rb->buf[t_end] != ch))
{
t_end = (t_end + 1) % rb->RbLen;
}
OS_ENABLE_INT();
if (t_end == rb->head)
{
return -1;
}
return t_end;
}
///////////////////////////////////////////////////////////////////////////////
// The end.
///////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -