【EmbeddedDev】通过mmap方法访问ADC/GPIO
来源:互联网 发布:知无涯者百度云资源 编辑:程序博客网 时间:2024/05/20 19:17
正常通过文件系统访问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
1 0
- 【EmbeddedDev】通过mmap方法访问ADC/GPIO
- 【EmbeddedDev】BBB上通过ADC串口获取光感数值
- Wince 下GPIO的访问方法
- Linux 下操作gpio(两种方法,驱动和mmap)
- Linux 下操作gpio(两种方法,驱动和mmap)
- Linux 下操作gpio(两种方法,驱动和mmap)
- 通过/dev/mem实现用户层访问GPIO寄存器
- mmap方法
- cc2541 gpio通用gpio和adc的使用
- linux下使用mmap控制GPIO
- 通过反射访问构造方法
- 通过javamain方法访问Controller
- arm GPIO访问规则
- mmap设备方法笔记
- mmap设备方法
- 通过修改hosts访问google的方法
- 通过反射访问构造方法(学习笔记)
- ADC方法(asymmetric distance computation)
- macbook pro chrome 开发者模式快捷键
- 简单链表与期末复习
- python读写Excel文件
- 泛型
- Mongoose学习参考文档
- 【EmbeddedDev】通过mmap方法访问ADC/GPIO
- Explicit Constructors(显式构造函数)收藏
- 跟我一起写 Makefile(六)
- Debug日记输出正常,html页面乱码问题
- 【操作记录】CentOS编译安装mysql
- jdk动态代理参数理解
- POJ 3420 Quad Tiling 已被翻译
- Linux下unzip乱码解决方案
- 项目名报错,Java compiler level does not match the version of the installed Java project facet.