基本信息
源码名称:环形缓冲区
源码大小:1.39KB
文件格式:.rar
开发语言:C/C++
更新时间:2021-06-11
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

纯C开发环形缓冲区,经过大量的测试,很实用的模块。可以在任意C编译器下编译,用于任意嵌入式单片机。


int RingBuffWrite( RingBuff_t * const obj, const unsigned char * const item, const int cnt )
{
    int offset;
    int cpyCntUp;
    int cpyCntDown;
    int writeCnt;
    
    do
    {
        writeCnt = RingBuffFreeSize( obj );
        if ( writeCnt == 0 || item == 0 || cnt <= 0 )
        {
            break;
        }
        if ( writeCnt > cnt )
            writeCnt = cnt;
        if ( obj->tailIdx >= obj->headIdx )
        {
            offset = writeCnt obj->tailIdx;
            if ( offset >= obj->size )
            {
                cpyCntUp = offset - obj->size;
                cpyCntDown = obj->size - obj->tailIdx;
                memcpy( obj->buff obj->tailIdx, item, cpyCntDown );
                if ( cpyCntUp > 0 )
                    memcpy( obj->buff, item cpyCntDown, cpyCntUp );
                obj->tailIdx = cpyCntUp;
                break;
            }
            else
            {
                memcpy( obj->buff obj->tailIdx, item, writeCnt );
                obj->tailIdx = writeCnt;
                break;
            }
        }
        else
        {
            memcpy( obj->buff obj->tailIdx, item, writeCnt );
            obj->tailIdx = writeCnt;
            break;
        }
    } while ( 0 );
    
    return writeCnt;
}

int RingBuffRead( RingBuff_t * const obj, unsigned char * const item, const int cnt )
{
    int offset;
    int cpyCntUp;
    int cpyCntDown;
    int readCnt;
    
    do
    {
        readCnt = RingBuffDataSize( obj );
        if ( readCnt == 0 || item == 0 || cnt <= 0 )
        {
            readCnt = 0;
            break;
        }
        if ( cnt < readCnt )
            readCnt = cnt;
        if ( obj->tailIdx > obj->headIdx )
        {
            memcpy( item, obj->buff obj->headIdx, readCnt );
            obj->headIdx = readCnt;
            break;
        }
        else
        {
            offset = readCnt obj->headIdx;
            if ( offset >= obj->size )
            {
                cpyCntUp = obj->size - obj->headIdx;
                cpyCntDown = offset - obj->size;
                memcpy( item, obj->buff obj->headIdx, cpyCntUp );
                if ( cpyCntDown > 0 )
                    memcpy( item cpyCntUp, obj->buff, cpyCntDown );
                obj->headIdx = cpyCntDown;
                break;
            }
            else
            {
                memcpy( item, obj->buff obj->headIdx, readCnt );
                obj->headIdx = readCnt;
                break;
            }
        }
    } while ( 0 );
    
    return readCnt;
}