首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入内存映射的IO。这个值需要多长时间才能被IO看到?

写入内存映射的IO。这个值需要多长时间才能被IO看到?
EN

Stack Overflow用户
提问于 2017-08-19 18:14:10
回答 3查看 759关注 0票数 0

我的FPGA中有一个内存映射的IO元素(准确地说,是AXI GPIO元素,它基本上将AXI内存映射的接口映射到一组引脚上),它通过GP0主端口连接并映射到ARM处理器的地址空间。FPGA和ARM处理器都是ZYNQ7000系列设备的一部分。当我写到元素的地址时,我应该在哪里查找文档,或者一般机制是什么,以确保电路‘看到’这个写入?让我们假设我有到volatile内存映射变量port的写入序列。

代码语言:javascript
运行
复制
port = 0;
port = 1;

那么,如何确保在一个10‘s的周期中,时钟过程(如果这与此相关的话)能够看到0,而在以后的周期中,时钟过程会看到一个1?理想情况下,如果有可能的话,这将是下一个周期。对于第一种方法,我只需等待足够长的cpu周期(使用循环计数器)。但这看起来是一种相当“残忍”的做事方式。

EN

回答 3

Stack Overflow用户

发布于 2017-08-19 18:42:24

对于一般的MMIO :没有“多长时间”可以看到一个写。如果你写一篇文章,它就会到公共汽车上去。如果你再写一篇文章,以后它就会到公共汽车上去。(假设MMIO范围的非缓存、非写入组合映射)。如果总线另一端的设备需要一些时间来处理写操作,那么通常会通过轮询设备来处理。

我不完全理解您的具体情况,但由于您说它的功能类似于GPIO外围设备,我将假设它非常简单,而且FPGA方面不会将写入看作总线上的事件,它只会看到"GPIO行“的更改状态。考虑到这一点,你有几个选择:

  1. 什么都不做。这两个写操作应该至少访问一个总线周期分隔的GPIO外围设备,如果这足够好(即GPIO不需要任何保持时间,而一个总线周期足够长),那么它就足够好了。
  2. 在两次写入之间插入端口的读取。这应该会增加一个额外的巴士掉头。
  3. 等等,就像你在问题中建议的那样。在处理硬件时,这是非常正常的事情,而10‘s并不是很长的时间。
票数 2
EN

Stack Overflow用户

发布于 2017-08-19 20:02:20

上一个答覆中没有提及另一个问题。仅在写入前插入读是不够的,特别是当位置被隐藏时。在这种情况下,有可能两个连续的写操作可能会按顺序到达目的地。这就是为什么ARM核心有特殊的屏障指令。

最理想的情况是下一个周期

你不能做这样的假设。你需要你分析特定的案例并选择合适的方法。

票数 0
EN

Stack Overflow用户

发布于 2017-12-12 23:11:35

在几乎任何具有“外部内存总线”外围设备的微控制器上,该外围设备将自动暂停任何CPU读取请求,直到数据可用为止,或者将停止任何CPU写入请求直到它们完成,或者暂停任何跟随写入请求的操作直到该请求完成。注意,外部总线上的操作只能相对于彼此进行排序,而不能相对于微控制器中的其他存储器或设备进行排序。例如,如果地址0xABCD 1234上有内存映射的外围设备,并且代码将1写入GPIO引脚A0,然后写入该外设,然后将1写入GPIO引脚A1,则外围写入的效果可能发生在写入A0之前,或写入A1之后,或者在I/O端口上的两个操作之间。使用内存屏障指令可能有助于确保排序,但是没有任何方法可以代替读取数据表。ARM上的内存屏障可以保证外部总线写入在设置I/O端口的指令之前完成,但是如果外部硬件需要两个周期来执行响应总线写入的动作(并非非常不寻常),则I/O端口上的操作可能仍会首先发生。

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

https://stackoverflow.com/questions/45774895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档