在生产者和消费者都只有一个的情况,环形缓冲区从实现机制上可以打到免锁的效果。环形缓冲区在相应中断处理速度方面效果非凡。
#include "stdafx.h"
#include "stdio.h"
#include "memory.h"
typedef unsigned long ULONG;
typedef unsigned short USHORT;
typedef unsigned char UCHAR;
#define NULL_PTR NULL
#define VOID void
#define VOS_OK 0
#define VOS_ERR 1
#define SIZE_OF_TL (5)
typedef struct tagTlv
{
UCHAR ucType; /* TLV类型 */
UCHAR ucLen1; /* TLV长度24-31比特 */
UCHAR ucLen2; /* TLV长度16-23比特 */
UCHAR ucLen3; /* TLV长度08-15比特 */
UCHAR ucLen4; /* TLV长度00-07比特 */
UCHAR aucValue[3]; /* 保留位,四字节对齐 */
} TLV_S;
#define RING_BUFFER_SIZE (30)
typedef struct tagRingBuffer
{
ULONG ulUsedBufferSize; /* 环形缓冲区已使用空间大小 */
UCHAR ucType; /* 通过TLV结构保存数据,代表Type */
UCHAR ucSrv[3]; /* 保留位,四字节对齐 */
UCHAR *pucReadCursor; /* 数据读取游标 */
UCHAR *pucWriteCursor; /* 数据写入游标 */
UCHAR aucBuffer[RING_BUFFER_SIZE]; /* 缓冲区 */
} RING_BUFFER_S;
RING_BUFFER_S g_stRingBuffer;
/************************************************************************
* 功能描述:初始化环形缓冲区
* 参数说明:UCHAR ucType 环形缓冲区TLV类型
* 原理说明:
* 返 回 值:环形缓冲区指针
*************************************************************************/
VOID *VOS_InitRingBuffer(UCHAR ucType)
{
g_stRingBuffer.ulUsedBufferSize = 0;
g_stRingBuffer.ucType = ucType;
g_stRingBuffer.pucReadCursor = g_stRingBuffer.aucBuffer;
g_stRingBuffer.pucWriteCursor = g_stRingBuffer.aucBuffer;
return &g_stRingBuffer;
}
/************************************************************************
* 功能描述:获取环形缓冲区已使用空间大小
* 参数说明:VOID *pRingBuffer 环形缓冲区指针
* 原理说明:
* 返 回 值:已使用空间大小
*************************************************************************/
ULONG VOS_GetUsedRingBufferSize(VOID *pRingBuffer)
{
RING_BUFFER_S *pstRingBuffer;
/* 内部函数不检查参数合法性 */
pstRingBuffer = (RING_BUFFER_S *)(pRingBuffer);
return pstRingBuffer->
ulUsedBufferSize;
}
/************************************************************************
* 功能描述:获取环形缓冲区空闲空间大小
* 参数说明:VOID *pRingBuffer 环形缓冲区指针
* 原理说明:
* 返 回 值:ULONG 空闲空间大小
*************************************************************************/
ULONG VOS_GetFreeRingBufferSize(VOID *pRingBuffer)
{
RING_BUFFER_S *pstRingBuffer;
/* 内部函数不检查参数合法性 */
pstRingBuffer = (RING_BUFFER_S *)(pRingBuffer);
return (sizeof(pstRingBuffer->aucBuffer) - pstRingBuffer->ulUsedBufferSize);
}
/************************************************************************
* 功能描述:智能拷贝数据到环形缓冲区
* 参数说明:UCHAR *pucRingBuffer 环形缓冲区指针
ULONG ulRingBufferSize 环形缓冲区大小
UCHAR *pucDst 数据拷贝目的指针(位于环形缓冲区内)
UCHAR *pucSrc 数据拷贝源指针
ULONG ulSrcSize 数据拷贝大小
* 原理说明:
* 返 回 值:CUAHR * 拷贝完数据后指针
*************************************************************************/
UCHAR *VOS_SmartCopyInfoBuffer(UCHAR *pucRingBuffer, ULONG ulRingBufferSize, UCHAR *pucDst, UCHAR *pucSrc, ULONG ulSrcSize)
{
ULONG ulTailLen;
UCHAR *pucCopyEnd;
/* 函数参数合法性检查 */
if ((NULL == pucRingBuffer) || (NULL_PTR == pucDst) || (NULL_PTR == pucSrc))
{
return NULL_PTR;
}
/* 获取环形缓冲区尾部可用空间大小 */
ulTailLen = (ULONG)((pucRingBuffer + ulRingBufferSize) - pucDst);
if (ulTailLen >= ulSrcSize)
{
/* 环形缓冲区尾部空间足够时,直接拷贝数据到尾部 */
memcpy(pucDst, pucSrc, ulSrcSize);
pucCopyEnd = pucDst + ulSrcSize;