栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Ping Pong Buffer 双缓冲 C++代码学习

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Ping Pong Buffer 双缓冲 C++代码学习

1、Ping Pong Buffer 原理分析

基本原理如上图所示,当设备有数据来时,先放入缓冲区1

然后将缓冲区1的数据放入缓冲区2,这时缓冲区1可接收下次数据。工作区可从缓冲区2拿数据 2、C++代码实现 相关结构体创建
typedef struct
    {
        void *buffer[2];
        volatile uint8_t writeIndex;
        volatile uint8_t readIndex;
        volatile uint8_t readAvaliable[2];
    } PingPongBuffer_t;

void *buffer[2] 无类型指针,指向不同数据类型的缓冲Buff

volatile uint8_t writeIndex 缓冲写索引

volatile uint8_t readIndex 缓冲读索引

volatile uint8_t readAvaliable[2] 可读标志位

相关函数实现
void PingPongBuffer_Init(PingPongBuffer_t *ppbuf, void *buf0, void *buf1)
{
    memset(ppbuf, 0, sizeof(PingPongBuffer_t));
    ppbuf->buffer[0] = buf0;
    ppbuf->buffer[1] = buf1;
}


bool PingPongBuffer_GetReadBuf(PingPongBuffer_t *ppbuf, void **pReadBuf)
{
    if (ppbuf->readAvaliable[0])
    {
        ppbuf->readIndex = 0;
    }
    else if (ppbuf->readAvaliable[1])
    {
        ppbuf->readIndex = 1;
    }
    else
    {
        return false;
    }
    *pReadBuf = ppbuf->buffer[ppbuf->readIndex];
    return true;
}


void PingPongBuffer_SetReadDone(PingPongBuffer_t *ppbuf)
{
    ppbuf->readAvaliable[ppbuf->readIndex] = false;
}


void PingPongBuffer_GetWriteBuf(PingPongBuffer_t *ppbuf, void **pWriteBuf)
{
    if (ppbuf->writeIndex == ppbuf->readIndex)
    {
        ppbuf->writeIndex = !ppbuf->readIndex;
    }
    *pWriteBuf = ppbuf->buffer[ppbuf->writeIndex];
}


void PingPongBuffer_SetWriteDone(PingPongBuffer_t *ppbuf)
{
    ppbuf->readAvaliable[ppbuf->writeIndex] = true;
    ppbuf->writeIndex = !ppbuf->writeIndex;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/529021.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号