环形缓冲区(二)
}
else
{
/* 环形缓冲区尾部空间不足时,拷贝部分数据到尾部,然后再拷贝数据到头部 */
memcpy(pucDst, pucSrc, ulTailLen);
memcpy(pucRingBuffer, pucSrc + ulTailLen, ulSrcSize - ulTailLen);
pucCopyEnd = pucRingBuffer + (ulSrcSize - ulTailLen);
}
return pucCopyEnd;
}
/************************************************************************
* 功能描述:智能从环形缓冲区拷贝数据
* 参数说明:UCHAR *pucRingBuffer 环形缓冲区指针
ULONG ulRingBufferSize 环形缓冲区大小
UCHAR *pucSrc 数据拷贝源指针(位于环形缓冲区内)
UCHAR *pucDst 数据拷贝目的指针
ULONG ulDstSize 数据拷贝大小
* 原理说明:
* 返 回 值:UCHAR * 拷贝完数据后指针
*************************************************************************/
UCHAR *VOS_SmartCopyFromBuffer(UCHAR *pucRingBuffer, ULONG ulRingBufferSize, UCHAR *pucSrc, UCHAR *pucDst, ULONG ulDstSize)
{
ULONG ulTailLen;
UCHAR *pucCopyEnd;
/* 函数参数合法性检查 */
if ((NULL == pucRingBuffer) || (NULL_PTR == pucSrc) || (NULL_PTR == pucDst))
{
return NULL_PTR;
}
/* 获取环形缓冲区尾部空间大小 */
ulTailLen = (ULONG)((pucRingBuffer + ulRingBufferSize) - pucSrc);
if (ulTailLen >= ulDstSize)
{
/* 环形缓冲区尾部空间足够时,直接从尾部拷贝数据 */
memcpy(pucDst, pucSrc, ulDstSize);
pucCopyEnd = pucSrc + ulDstSize;
}
else
{
/* 环形缓冲区尾部空间不足时,从尾部拷贝部分数据,然后再从头部拷贝数据 */
memcpy(pucDst, pucSrc, ulTailLen);
memcpy(pucDst + ulTailLen, pucRingBuffer, ulDstSize - ulTailLen);
pucCopyEnd = pucRingBuffer + (ulDstSize - ulTailLen);
}
return pucCopyEnd;
}
/************************************************************************
* 功能描述:将用户数据压入环形缓冲区
* 参数说明:VOID *pRingBuffer 环形缓冲区指针
VOID *pFrameBuffer 用户数据指针
ULONG ulFrameBufferLen 用户数据大小
* 原理说明:
* 返 回 值:VOS_OK 数据压入环形缓冲区成功
VOS_ERR 数据压入环形缓冲区失败
*************************************************************************/
ULONG VOS_PushBuffer(VOID *pRingBuffer, VOID *pFrameBuffer, ULONG ulFrameBufferLen)
{
ULONG ulFreeRingBufferSize;
TLV_S stTlv;
UCHAR *pucCopyEnd;
RING_BUFFER_S *pstRingBuffer;
/* 函数参数合法性检查 */
if ((NULL_PTR == pRingBuffer) || (NULL_PTR == pFrameBuffer))
{
return VOS_ERR;
}
pstRingBuffer = (RING_BUFFER_S *)pRingBuffer;
/* 获取环形缓冲区可用空间 */
ulFreeRingBufferSize = VOS_GetFreeRingBufferSize(pstRingBuffer);
/* 环形缓冲区可用空间不足 */
if (ulFreeRingBufferSize < (ulFrameBufferLen + SIZE_OF_TL))
{
return VOS_ERR;
}
/* 写入TL字段 */
stTlv.ucType = pstRingBuffer->
ucType;
stTlv.ucLen1 = (UCHAR)((ulFrameBufferLen >> 24) & 0xFF);
stTlv.ucLen2 = (UCHAR)((ulFrameBufferLen >> 16) & 0xFF);
stTlv.ucLen3 = (UCHAR)((ulFrameBufferLen >> 8) & 0xFF);
stTlv.ucLen4 = (UCHAR)((ulFrameBufferLen >> 0) & 0xFF);
pucCopyEnd = VOS_SmartCopyInfoBuffer(pstRingBuffer->aucBuffer,
sizeof(pstRingBuffer->aucBuffer),
pstRingBuffer->pucWriteCursor,
(UCHAR *)(&stTlv),
SIZE_OF_TL);
pstRingBuffer->pucWriteCursor = pucCopyEnd;
pstRingBuffer->ulUsedBufferSize += SIZE_OF_TL;
/* 写入用户数据 */
pucCopyEnd = VOS_SmartCopyInfoBuffer(pstRingBuffer->aucBuffer,
sizeof(pstRingBuffer->aucBuffer),
pstRingBuffer->pucWriteCursor,
(UCHAR *)(pFrameBuffer),
ulFrameBufferLen);
pstRingBuffer->pucWriteCursor = pucCopyEnd;
pstRingBuffer->ulUsedBufferSize += ulFrameBufferLen;
return VOS_OK;
}
/************************************************************************
* 功能描述:从环形缓冲区读取数据
* 参数说明:VOID *pRingBuffer 环形缓冲区指针
VOID *pFrameBuffer 用户数据指针(用户保证内存不存在越界)
ULONG *pulFrameBufferLen用户数据大小
* 原理说明:
* 返 回 值:VOS_OK 数据压入环形缓冲区成功
VOS_