mmap(三) mmap测试程序,user和设备驱动传递大量数据

1,将驱动中产生的大量数据通过mmap传递到用户空间

构造一个ringbuffer,驱动中将产生的数据放入ringbuffer,用户空间将ringbuffer中的数据读走存在文件中

2,driver

#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/version.h>
#include <linux/kfifo.h>
#include <linux/miscdevice.h>
#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/mman.h>

#define LOG_FIFO_SIZE 8172
#define LOG_DEVICE_NAME "tp_tools"
#define LOG_RINGBUFFER_SIZE 8192
#define GTP_MMAP_PAGE_ORDER   3

struct ringbuffer {
    unsigned int in;
    unsigned int out;
    unsigned int size;
    unsigned char buffer[LOG_RINGBUFFER_SIZE];
};


struct good_ts_log {
    struct kfifo        fifo;
    wait_queue_head_t   wq;
    struct miscdevice   miscdev;
    struct ringbuffer *rbuffer;
};

static struct good_ts_log ts_log_dev;

ringbuffer start///

int _ringbuffer_init(struct ringbuffer *rbuffer, unsigned int size)
{
    /* size must be a power of 2 */
    BUG_ON(size & (size -1));

    rbuffer->size = size;
    rbuffer->in = rbuffer->out = 0;
    ts_info("_ringbuffer_init success");

    return 0;
}

/* puts some data into the ringbuffer, no locking version */
unsigned int _ringbuffer_put(struct ringbuffer *rbuffer,
    unsigned char *buffer, unsigned int len)
{
    unsigned int l;

    len = min(len, rbuffer->size - rbuffer->in + rbuffer->out);

    /* first put the data starting from rbuffer->in to buffer end */
    l = min(len, rbuffer->size - (rbuffer->in & (rbuffer->size -1)));
    memcpy(rbuffer->buffer + (rbuffer->in & (rbuffer->size -1)), buffer, l);

    /* then put the reset (if any) at the beginging of the buffer */
    memcpy(rbuffer->buffer, buffer + l, len -l);

    rbuffer->in += len;

    return len;
}

/* gets some data from the ringbuffer, no locking version */
__maybe_unused unsigned int ringbuffer_get(struct ringbuffer *rbuffer, unsigned char *buffer,
    unsigned int len)
{
    unsigned int l;

    len = min(len, rbuffer->in - rbuffer->out);

    /* first get the data from rbuffer->out until the end of the buffer */
    l = min(len, rbuffer->size - (rbuffer->out & (rbuffer->size -1)));
    memcpy(buffer, rbuffer->buffer + (rbuffer->out & (rbuffer->size -1)), l);

    /* then get the reset (if any) from the beginning of the buffer */
    memcpy(buffer + l, rbuffer->buffer, len - l);

    rbuffer->out += len;

    return len;
}

/* check if ringbuffer is full or empty
* return 0: empty
* return length == size: 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值