【EmbeddedDev】通过mmap方法访问ADC/GPIO

正常通过文件系统访问AIN串口的值, 可以使用fread等文件IO方式读取/sys/bus/iio/devices/iio:device0/in_voltage*_raw的内容。

但是这样在需要高频获取ADC值得情况就显得效率很低下, 数据需要从磁盘拷贝到内核进程空间, 然后再拷贝到用户进程空间, 消耗无谓的资源。

可以通过内存影射的方式来解决这个问题, mmap可以实现磁盘数据到用户主存的一次数据拷贝, 从而达到用户空间驱动的高效率。

在linux下可以查看到/dev/mem这个文件, 可以认为是物理内存的镜像, 能用来访问物理内存。

而在Beaglebone Black下可以通过访问/dev/mem来访问GPIO,ADC这些数据。mmap建立映射关系示例:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdint.h>
#include <sys/mman.h>
#include <fcntl.h>


#define MMAP_OFFSET (0x44C00000)
#define MMAP_SIZE   (0x481AEFFF-MMAP_OFFSET)
static volatile uint32_t *map;
static char mapped = FALSE;


int init_mmap()
{
    if(!mapped)
    {
        int fd;
        fd = open("/dev/mem", O_RDWR);
        if(fd == -1)
        {
            perror("Unable to open /dev/mem");
            exit(EXIT_FAILURE);
        }
        map = (uint32_t*)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, MMAP_OFFSET);
        if(map == MAP_FAILED)
        {
            close(fd);
            perror("Unable to map /dev/mem");
            exit(EXIT_FAILURE);
        }
        mapped = TRUE;
    }
    return mapped;
}

目前具体的实现代码是基于github上的一个项目来进行修改。有兴趣可以参考这里: https://github.com/alban-rochel/pixbox-controls/tree/master/service


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值