环形缓冲区(二)

2014-11-24 11:00:32 · 作者: · 浏览: 2
} 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_