Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ARM:我可以直接访问ioremap_nocache()返回的范围(而不使用ioread*()/iowrite*())吗?

ARM:我可以直接访问ioremap_nocache()返回的范围(而不使用ioread*()/iowrite*())吗?
EN

Stack Overflow用户
提问于 2015-03-16 10:03:45
回答 1查看 1.5K关注 0票数 2

我正在使用TI AM3358 SoC,运行一个运行Linux3.12的ARM Cortex-A8处理器。我在设备树中启用了GPMC节点的一个子设备,它探测我的驱动程序,在那里,我用设备树节点提供的资源调用ioremap_nocache(),以获得一个未缓存的区域。

我之所以不请求缓存,是因为它不是连接到GPMC总线的实际内存设备,它当然会从处理器缓存中受益,而是一个FPGA设备。因此,访问需要始终通过实际的电线。

当我这么做时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
u16 __iomem *addr = ioremap_nocache(...);

iowrite16(1, &addr[0]);
iowrite16(1, &addr[1]);
iowrite16(1, &addr[2]);
iowrite16(1, &addr[3]);
ioread16(&addr[0]);
ioread16(&addr[1]);
ioread16(&addr[2]);
ioread16(&addr[3]);

我看到这8次访问是用逻辑分析器在电线上完成的。然而,当我这样做时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
u16 v;

addr[0] = 1;
addr[1] = 1;
addr[2] = 1;
addr[3] = 1;
v = addr[0];
v = addr[1];
v = addr[2];
v = addr[3];

我看到了四个写访问,但没有看到后续的读访问。

我是不是遗漏了什么?ioread16()和直接内存访问之间有什么区别,因为它知道整个GPMC范围应该和内存一样是可寻址的?

这种行为是否是可以避免的编译器优化的结果?我还没有看生成的指令,但在那之前,可能有人有足够的经验,有一些有趣的答复。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-24 14:00:08

ioread*()iowrite*()在ARM上执行数据内存屏障,然后执行volatile访问,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define readb(c)                ({ u8  __v = readb_relaxed(c); __iormb(); __v; })
#define readw(c)                ({ u16 __v = readw_relaxed(c); __iormb(); __v; })
#define readl(c)                ({ u32 __v = readl_relaxed(c); __iormb(); __v; })

#define writeb(v,c)             ({ __iowmb(); writeb_relaxed(v,c); })
#define writew(v,c)             ({ __iowmb(); writew_relaxed(v,c); })
#define writel(v,c)             ({ __iowmb(); writel_relaxed(v,c); })

__raw_read*()__raw_write*() ( *bwl)可用于直接读/写。它们执行这些操作所需的精确的单一指令,将地址指针转换为volatile指针。

__raw_writew()示例(存储寄存器,半字):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define __raw_writew __raw_writew
static inline void __raw_writew(u16 val, volatile void __iomem *addr)
{
        asm volatile("strh %1, %0"
                     : "+Q" (*(volatile u16 __force *)addr)
                     : "r" (val));
}

但是,请注意,这两个函数没有插入任何障碍,因此您应该在任何您希望对内存访问进行排序的地方调用rmb() (读内存屏障)和wmb() (写内存屏障)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29083876

复制
相关文章
独立编址,统一编址,IO端口,IO内存,冯·诺伊曼,哈佛结构
独立编址,统一编址: I/O地址空间与内存地址空间编址方式是否统一?例如51为统一编址,I/O和存储器总计64K地址空间;X86为独立编址,分为I/O地址空间和存储器地址空间。 IO空间,内存空间
全栈程序员站长
2022/09/27
1K0
嵌入式Linux系统是如何管理IO端口以及IO内存的呢?老司机给你讲讲
端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
刘盼
2021/01/07
2K0
为什么域名能够访问网站,而直接使用IP不可以
在访问杭电官网杭电官网的时候,直接在浏览器上,输入域名是可以得到访问结果的。因此,产生了一种猜测,既然网络中实际上是根据域名转换的IP来直接访问服务器的,那么我直接通过IP来访问杭电官网是否可以??
格姗知识圈
2019/07/19
11.1K0
为什么域名能够访问网站,而直接使用IP不可以
详解io端口与io内存
1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。
刘盼
2021/01/11
2.8K0
【i.MX6ULL】驱动开发4——点亮LED(寄存器版)
上篇文章(【i.MX6ULL】驱动开发3——GPIO寄存器配置原理),介绍了i.MX6ULL芯片的GPIO的工作原理与寄存器配置。
xxpcb
2021/09/29
8630
可以直接访问的ChatGPT来了
Java List<EvaluationItemRecordDTO> 按照evaluationItemId分组 按照score求平均值最后求和
编程那点事
2023/03/31
9820
可以直接访问的ChatGPT来了
ioremap_nocache() 函数的使用
调用ioremap_nocache()函数之后,返回一个线性地址,此时CPU 可以访问设备的内存(已经将其映射到了线性地址空间中了),此时CPU可以使用访问内存的指令访问设备的内存空间,此时我们就可以像访问内存一样来访问设备的内存(寄存器)。
233333
2019/05/25
1.5K0
使用 ChatGPT 可以直接写 WordPress 插件,我要失业了
最近 ChatGPT 这个智能对话机器人,非常很火,可以做很多事情,能直接生成代码、会自动修复 bug、还能写诗,各种话题都能 hold 住,把 Google 都搞紧张了。
Denis
2023/04/13
9970
使用 ChatGPT 可以直接写 WordPress 插件,我要失业了
如何设置nginx可以让ip可以直接访问网站
类似下面这样配置就可以了 server { listen 80; server_name 1.1.1.1; root /web/data; .... } 未经允许不得转载:肥猫博客 » 如何设置nginx可以让ip可以直接访问网站
超级小可爱
2023/02/20
2.2K0
云硬盘可以直接使用吗?云硬盘和云存储的区别
从事和互联网相关工作的人都了解,现在市场上面出现了一大批的云硬盘以及云服务器,这些云产品拥有更加广泛的性能以及更加丰富的型号,在大家构建网站或者是进行互联网操作的时候,有了更多的选择。云硬盘和云服务器的作用都是非常强大的,而且比起物理服务器以及物理硬盘拥有更多的便捷性,云硬盘可以直接使用吗?现在带大家来了解一下。
用户8715145
2022/03/23
7.6K0
丰田生产方式可以直接复制吗?
故事开始于丰田车主参观了一条装配线和大规模生产设施--这种装配线为亨利·福特赚了数百万美元。然而,丰田的高管们对此印象并不深刻。他们离开工厂后觉得浪费太多,整个操作没有意义。之后,他们参观了一家超市--Piggly Wiggly--就在这里里灵感击中了他们。在超市,他们注意到,只要有顾客买了一杯饮料,就会立即换成另一杯。换句话说,货架上没有等着要人买的饮料。下一杯饮料只有在前一杯被购买时才会被取出。这引发了“拉动式生产”原则的诞生,丰田汽车公司将其作为丰田生产系统的核心原则之一。
用户9972271
2023/02/08
5310
idea的mybatis插件不联网可以使用吗_idea特效插件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/08
1K0
Java避坑指南:使用ExecutorCompletionService处理任务,而不处理返回值,导致OOM
使用java.util.concurrent.ExecutorCompletionService异步处理任务:
崔认知
2023/06/19
4400
Java避坑指南:使用ExecutorCompletionService处理任务,而不处理返回值,导致OOM
CTO不写代码,真的可以吗?
导读:CTO 在公司里是干嘛的?到底写不写代码?该不该做代码评审(Code Review),亲力亲为给程序员做出榜样?还是把握一下大方向,设计架构,管管程序员,提供一些培训?
IT阅读排行榜
2018/10/25
1.5K0
CTO不写代码,真的可以吗?
pycharm使用anaconda环境可以直接导入包吗_anaconda pycharm环境配置
使用pycharm进行python脚本开发,特别是进行科学计算时,需要引入大量的第三方脚本,此时如果每次都需要去逐一下载,无疑浪费了许多时间。这时可以使用Anaconda来快速的搭建一个开发环境
全栈程序员站长
2022/09/27
1.1K0
pycharm使用anaconda环境可以直接导入包吗_anaconda pycharm环境配置
Vue 中 props 是 Object 可以直接修改吗
https://www.zhihu.com/question/609822540/answer/3099837968
windliang
2023/08/18
1K0
Vue 中 props 是 Object 可以直接修改吗
Tomcat 输入ip可以直接访问项目的方法
1.  配置默认的项目名称。   在tomcat/conf/server.xml中   在             <Host name="localhost"  appBase="webapps"             unpackWARs="true" autoDeploy="true"             xmlValidation="false" xmlNamespaceAware="false">
星哥玩云
2022/06/28
1.5K0
点击加载更多

相似问题

我可以使用ioread32_rep(addr,buf,2)替换ioread64()吗?

16

ioread32后面跟着iowrite32没有给出相同的值

12

Google我可以直接使用SQLAlchemy访问数据库吗?而不是本地访问

10

我可以不创建临时对象而直接调用operator()吗?

50

我可以使用NodeJS而不返回html文件吗?

60
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文