环形缓冲区(一)

2014-11-24 11:00:32 · 作者: · 浏览: 3

在生产者和消费者都只有一个的情况,环形缓冲区从实现机制上可以打到免锁的效果。环形缓冲区在相应中断处理速度方面效果非凡。

#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;