应用层操作寄存器
驱动中操作寄存器,需要先进行映射将物理地址转为虚拟地址。
但如果想在应用层中操作寄存器,也是可以实现的。
应用层中只需打开/dev/mem
设备节点,然后用mmap
映射寄存器地址就可以访问了。
例如,应用层读取物理地址为0x40000000
的值:
#include < stdio.h >
#include < stdlib.h >
#include < time.h >
#include < unistd.h >
#include < fcntl.h >
#include < unistd.h >
#include < sys/mman.h >
#define MAP_SIZE 0x80000
#define base 0x40000000
int main(int argc, char **argv)
{
int fd = open("/dev/mem",O_RDWR|O_NDELAY);
if (fd < 0)
{
printf("open /dev/mem error!n");
return -1;
}
void *map_base = mmap(NULL,MAP_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,base);
if (map_base == MAP_FAILED)
return -1;
printf("%x n",*(volatile unsigned int*)(map_base));
close(fd);
munmap(map_base,MAP_SIZE);
return 0;
}
注意,内核必须将CONFIG_STRICT_DEVMEM=y配置选项打开才有/dev/mem节点
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
寄存器
+关注
关注
30文章
5037浏览量
117765 -
内核
+关注
关注
3文章
1309浏览量
39862 -
Linux
+关注
关注
87文章
10992浏览量
206745 -
应用层
+关注
关注
0文章
43浏览量
11441
发布评论请先 登录
相关推荐
嵌入式linux驱动对gpio的基本操作
;amp;amp;gt;&amp;gt;&amp;gt;应用编写(闪烁灯)。目标板是iTOP4412。CPU为 Exynos4412。代码代码部分包括 驱动层代码对GPIO寄存器的直接操作。然后是
发表于 11-05 07:59
使用寄存器的逻辑操作指令是什么?
操作系统中硬件相关的部分集中体现在汇编指令和对寄存器的操作中,因此我们对ARM体系结构的介绍也围绕ARMv8-A的汇编指令和寄存器来展开。
C语言位操作在(单片机)寄存器中的应用
C语言位操作在寄存器中的应用本文参考另一篇博客写成附链接,个人感觉内容过多不便于吸收,就写了这篇博客。整体思想:设置一个位就是设置该位为1,清除就是设置该位为0寄存器操作的要求:特定位
发表于 11-29 10:06
•8次下载
寄存器reg &= ~1 位与操作的问题
在网上偶尔看到一个关于寄存器某位清零的操作,有人指出如题写法并不健壮,此博客记录。问题的关键在于 ~1 的值,假设 1 占8位(由编译器决定),二进制表示为 0000 0001那么
发表于 01-13 14:06
•0次下载
STM32的寄存器操作
STM32的寄存器操作在使用STM32单片机编程时一般都用ST给的库函数编程,库函数编程的底层就是对单片机寄存器的操作,库函数就是一系列寄存器
发表于 01-13 15:43
•18次下载
Linux驱动操作寄存器
,第四个参数是映射的大小。 驱动中操作: #define OFFSET 0x60 //某个寄存器的偏移地址 static int my_probe(struct platform_device
如何在shell中操作寄存器
shell 中操作寄存器可以使用 devmem 命令. devmem 命令其实就是上述应用层操作寄存器生成的可执行文件,只不过busybox
评论