c ringbuffer 源码_ringbuffer.c

该博客详细介绍了环形缓冲区(Ring Buffer)的数据结构及其初始化、读取、写入、查看等操作的C语言实现。代码中包含了错误检查和边界处理,但未考虑中断的影响,也不支持异步读写。RingBuffer_Init用于初始化缓冲区,RingBuffer_Size返回缓冲区总容量,RingBuffer_DataLen返回缓冲区中数据的长度,RingBuffer_SpaceLen返回剩余可写入的空间。此外,还提供了RingBuffer_Read、RingBuffer_Peek和RingBuffer_Write等函数,分别用于读取、查看和写入数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "./include/ringbuffer.h"

#include "./include/basictype.h"

#include "./include/sys_dbg.h"

#include

// TODO:

// 1. 暂时未考虑中断的影响

// 2. 读取和写入暂时不支持异步方式

void *RingBuffer_Init(RingBuffer_t *ringBuf, UINT8 *buf, UINT32 bufSize) {

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

SYS_ASSERT(bufSize > 0);

ringBuf->start = buf;

ringBuf->end = buf + bufSize - 1;

ringBuf->lpos = buf;

ringBuf->rpos = buf;

return (void *)ringBuf;

}

INT32 RingBuffer_Size(RingBuffer_t *ringBuf) {

SYS_ASSERT(ringBuf != NULL);

return (ringBuf->end - ringBuf->start);

}

INT32 RingBuffer_DataLen(RingBuffer_t *ringBuf) {

SYS_ASSERT(ringBuf != NULL);

if (ringBuf->lPos <= ringBuf->rpos) {

return (ringBuf->rpos - ringBuf->lPos);

} else {

INT32 leftSize = ringBuf->rpos - ringBuf->start;

INT32 rightSize = ringBuf->end - ringBuf->lpos + 1;

return (leftSize + rightSize);

}

}

// RingBuffer的剩余空间大小

INT32 RingBuffer_SpaceLen(RingBuffer_t *ringBuf) {

SYS_ASSERT(ringBuf != NULL);

return (RingBuffer_Size(ringBuf) - RingBuffer_DataLen(ringBuf));

}

static INT32 RingBuffer_copyBlock(UINT8 *pDst, UINT8 *pSrc, UINT8 *pSrcLimit) {

SYS_ASSERT(pDst != NULL);

SYS_ASSERT(pSrc != NULL);

SYS_ASSERT(pSrcLimit != NULL);

SYS_ASSERT(pSrc < pSrcLimit);

INT32 copyLen = 0;

while (pSrc < pSrcLimit) {

*pDst++ = *pSrc++;

copyLen++;

}

return copyLen;

}

INT32 RingBuffer_Read(RingBuffer_t *ringBuf, UINT8 *buf, INT32 toReadSize) {

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

if (!toReadSize)

return 0;

INT32 dataLen = RingBuffer_DataLen(ringBuf);

if (!dataLen)

return 0;

if (toReadSize > dataLen)

toReadSize = dataLen;

if (ringBuf->lpos < ringBuf->rpos) {

memcpy(buf, ringBuf->lpos, toReadSize);

ringBuf->lpos = ringBuf->lpos + toReadSize;

return toReadSize;

} else {

INT32 copyLen;

if ((ringBuf->end - ringBuf->lpos + 1) >= toReadSize) {

copyLen = RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->lpos + toReadSize);

ringBuf->lpos += copyLen;

return copyLen;

}

copyLen = RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->end + 1);

toReadSize -= copyLen;

buf += copyLen;

copyLen += RingBuffer_copyBlock(buf, ringBuf->start, ringBuf->start + toReadSize);

ringBuf->lpos = ringBuf->start + toReadSize;

return copyLen;

}

}

INT32 RingBuffer_Peek(RingBuffer_t *ringBuf, UINT8 *buf, INT32 peekSize){

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

if (!peekSize)

return 0;

INT32 dataLen = RingBuffer_DataLen(ringBuf);

if (!dataLen)

return 0;

if (peekSize > dataLen)

peekSize = dataLen;

if (ringBuf->lpos < ringBuf->rpos) {

memcpy(buf, ringBuf->lpos, peekSize);

return peekSize;

} else {

INT32 copyLen;

if ((ringBuf->end - ringBuf->lpos + 1) >= peekSize) {

return RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->lpos + peekSize);

}

copyLen = RingBuffer_copyBlock(buf, ringBuf->lpos, ringBuf->end + 1);

peekSize -= copyLen;

buf += copyLen;

copyLen += RingBuffer_copyBlock(buf, ringBuf->start, ringBuf->start + peekSize);

return copyLen;

}

}

INT32 RingBuffer_Write(RingBuffer_t *ringBuf, UINT8 *buf, INT32 toWriteSize) {

SYS_ASSERT(ringBuf != NULL);

SYS_ASSERT(buf != NULL);

if (!toWriteSize)

return 0;

INT32 spaceLen = RingBuffer_SpaceLen(ringBuf);

if(!spaceLen)

return 0;

if (toWriteSize > spaceLen)

toWriteSize = spaceLen;

INT32 copyLen;

if(ringBuf->lpos > ringBuf->rpos){

copyLen = RingBuffer_copyBlock(ringBuf->rpos, buf, buf + toWriteSize);

ringBuf->rpos += ringBuf->rpos + copyLen;

if(ringBuf->rpos>ringBuf->end)

ringBuf->rpos=ringBuf->start;

return copyLen;

}else{

INT32 rLeftSize = ringBuf->end-ringBuf->rpos+1;

if(rLeftSize >= toWriteSize){

copyLen = RingBuffer_copyBlock(ringBuf->rpos, buf, buf + toWriteSize);

ringBuf->rpos += ringBuf->rpos + toWriteSize;

if(ringBuf->rpos > ringBuf->end)

ringBuf->rpos = ringBuf->start;

return copyLen;

}

copyLen = RingBuffer_copyBlock(ringBuf->rpos, buf, buf + rLeftSize);

buf += rLeftSize;

toWriteSize -= copyLen;

copyLen += RingBuffer_copyBlock(ringBuf->start, buf, buf + toWriteSize);

ringBuf->rpos = ringBuf->start + toWriteSize;

if(ringBuf->rpos>ringBuf->end)

ringBuf->rpos=ringBuf->start;

return copyLen;

}

}

void RingBuffer_Reset(RingBuffer_t *ringBuf){

SYS_ASSERT(ringBuf != NULL);

ringBuf->start = NULL;

ringBuf->end = NULL;

ringBuf->lpos = NULL;

ringBuf->rpos = NULL;

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

<think>我们正在处理用户的问题:用户想要查找ring_buffer.c文件的路径。根据用户提供的引用,特别是引用[2]中展示了如何查找msm_drm.h文件,我们可以采用类似的方法来查找ring_buffer.c。在引用[2]中,使用了`find`命令在根目录下搜索文件。我们可以使用相同的命令来搜索ring_buffer.c。但是,需要注意的是,ring_buffer.c是一个内核文件,通常位于内核源代码目录中。因此,我们可能需要在内核源代码目录中查找,或者在整个文件系统中搜索。由于用户没有提供具体的内核版本或路径,我们可以建议使用以下命令:1.在整个文件系统中搜索:```bashsudofind /-namering_buffer.c```2.如果知道内核版本,可以在内核源码目录中查找。通常,内核源码位于`/usr/src/`目录下,例如:```bashfind/usr/src/-namering_buffer.c```另外,根据引用[3],提到了Linux内核头文件的路径(如`/usr/src/linux-headers-4.15.0-112`),所以ring_buffer.c可能位于类似的内核头文件目录中。但是,需要注意的是,通常内核头文件目录中只包含头文件(.h)和配置文件,而不包含源文件(.c)。因此,如果用户安装的是内核头文件包,可能不会包含ring_buffer.c。要获取内核源代码,可能需要安装完整的内核源代码包。因此,我们可以建议用户: -首先尝试在整个文件系统中搜索(可能需要sudo权限,因为有些目录需要权限)。 -如果找不到,可能需要安装对应版本的内核源代码。另外,根据引用[1]和引用[3]的内容,它们与当前问题关联不大,引用[1]是关于PostgreSQL的配置,引用[3]是关于编译依赖的软件包。所以,我们主要参考引用[2]的方法。回答结构:1.解释查找方法。2.提供命令示例。3.说明可能的情况和解决方案。同时,根据系统级指令,我们需要生成相关问题。注意:我们不需要在回答中重复引用标识,除非我们确实引用了这些内容。在回答中,我们提到了引用[2]的方法,所以可以自然地添加引用标识。另外,由于用户的问题是关于查找文件,我们不需要使用数学公式,所以不需要使用$...$或$$...$$。但是,如果回答中涉及到路径等,我们可以用行内代码格式(用反引号)表示。生成的相关问题可以围绕如何安装内核源代码、如何确定内核版本等。回答如下:</think>### 查找 `ring_buffer.c` 文件的方法 #### 1. **使用 `find` 命令全局搜索** 在终端执行以下命令搜索整个文件系统: ```bash sudo find / -name ring_buffer.c 2>/dev/null ``` - **说明**: - `sudo` 提升权限以访问系统目录 - `2>/dev/null` 过滤权限错误等干扰信息 - 典型路径可能位于内核源码目录,例如: `/usr/src/linux-headers-<版本>/kernel/trace/ring_buffer.c` #### 2. **定位内核源码目录** 若已安装内核头文件,可通过以下方式定位: ```bash # 查看当前内核版本 uname -r # 搜索对应版本源码目录 find /usr/src/ -name "linux-headers-$(uname -r)" -exec find {} -name ring_buffer.c \; ``` #### 3. **通过包管理器查找** 对于基于 Debian/Ubuntu 的系统: ```bash # 定位文件所属包 sudo apt-file search ring_buffer.c # 若未安装 apt-file sudo apt update && sudo apt install apt-file sudo apt-file update ``` 对于 RPM 系系统(如 Fedora/CentOS): ```bash rpm -ql kernel-devel | grep ring_buffer.c ``` #### 4. **在线代码库参考** 若本地未找到,可在线查看内核源码- [Linux 内核 GitHub 仓库](https://github.com/torvalds/linux/tree/master/kernel/trace/ring_buffer.c) - 文件通常位于:`kernel/trace/ring_buffer.c` --- ### 常见路径示例 根据引用[2]的查找方法,类似内核文件通常位于以下位置[^2]: - `/usr/src/linux-headers-<版本>/kernel/trace/` - `/lib/modules/<版本>/build/kernel/trace/` > ⚠️ **注意**:实际路径取决于内核版本和发行版配置,建议优先使用 `find` 命令动态定位。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值