设备驱动中环形缓冲区数据存储和读写同步的实现

本文介绍了如何在设备驱动中使用环形缓冲区实现数据存储和读写同步。通过自定义数据结构定义缓冲区的起始、结束、读写指针和大小。利用内存分配函数初始化缓冲区,并设定读写规则。当缓冲区为空时,读操作会阻塞,写操作可使用整个缓冲区;当缓冲区有数据时,读操作不会阻塞,而写操作根据剩余空间决定是否阻塞。通过信号量和阻塞/唤醒机制实现读写同步,具体实现细节在scull_p_read和scull_p_write函数中详细阐述。
摘要由CSDN通过智能技术生成

首先通过自定义数据结构,对缓冲区做几个基本的指针和参数进行定义:

char * buffer_start, *buffer_end                 指向buffer起始端和结束端的指针

char *wp ,*rp                                                  数据的读写指针

int buffersize                                                   buffer大小

调用内存分配函数kmalloc函数,为该数据结构申请内存空间,初始化结束后,数据的读写指针都指向char *buffer_star,对于缓冲区,我们可以做一下几个rules:

1. *wp = *rp :这个数据缓冲区是空的。对于读操作,遇到这种情况读操作应该会被阻塞,无数据可读,读进程进入睡眠等待状态;对于写操作,写睡眠将被唤醒,可写入的大小为整个buffer空间的大小

2. *wp > *rp :缓冲区有数据可读,可读大小为wp-rp,读进程不会不会被阻塞,而wp-rp=buffersize时,写进程被阻塞进入睡眠,若wp-rp<buffersize时,写进程不会被阻塞,buffer还有空间可以写入

3. *wp< *rp: 如果wp rp指向buffer_end的时候,会自动反转到buffer_start位置,可写空间为rp-wp-1

通过阻塞和睡眠机制,我们可以实现对这个buffer的读写的同步,下面还是以代码的方式讲解一下读写同步的原理:

static ssize_t scull_p_read (struct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值