【问题标题】:How memory mapped IOs are read by the CPU?CPU如何读取内存映射的IO?
【发布时间】:2020-04-19 13:22:56
【问题描述】:

我正在学习内存映射 IO。到目前为止,我已经了解到 CPU 读写特定的内存地址以写入或读取到某个 IO 设备。在传统方式中,IO 设备用于生成中断,这就是 CPU 过去如何知道 IO 设备已完成处理并且它有结果要被 CPU 消耗的方式。

但是在内存映射 IO 中没有这样的规定,对吧?因此,根据我的知识(这没有意义)来读取 IO 设备是否向 CPU 提供了任何结果,或者 CPU 是否需要每次都去读取内存。那不是很糟糕吗?这比投票更糟糕,对吧?因为它增加了从内存中读取的周期。

我在这里缺少什么?请帮忙。

【问题讨论】:

  • 你混淆了两个不相关的问题,中断和内存映射。
  • 中断和内存映射 I/O 不是互斥的。您认为中断处理程序如何检索“结果”?您将中断驱动的 I/O 与轮询 I/O 进行比较。现代或旧处理器如何工作也不是问题,所有处理器都可以使用;这是一个软件设计决策,而不是架构约束。你真的偏离了轨道。

标签: embedded


【解决方案1】:

以我的设备为例:

MEMORY {
   IRAM        : origin = 0x0,         len = 0x30000
   CACHE_L2    : origin = 0x30000,     len = 0x10000
   SDRAM       : origin = 0x80000000,  len = 0x1000000
   FPGA_A1     : origin = 0x90000000,  len = 0x1000
   FPGA_A2     : origin = 0xA0000000,  len = 0x1000
   WATCHDOG    : origin = 0xB0000000,  len = 0x1
}

这是为我的 C6713 DSP 准备的。它与两个 FPGA 的 FPGA_1 和 FPGA_2 共享内存,并与 PowerPC CPU 的 SDRAM 部分共享内存。 这就是所谓的内存映射设备的例子。 这两个 FPGA 基本上处理 ADC 转换、脉冲、数字 IO 和保护。 让我们坚持一个ADC。

  • 普通 C6713 将以 50 微秒处理 ADC。在同一级别,我们将执行我们的控制循环。也许我们可以将它推到 25 微秒,但我们正在消耗越来越多的 CPU,C6713 将能够随着采样速度的每次提高而做的越来越少。
  • 而 FPGA 每 1 微秒执行一次 ADC 转换。因此,当第一个控制循环开始运行时,FPGA 已经产生了 50 个值。但是我们的控制循环并不需要它,它可以进入内存,只需执行一个读取操作,它就有它需要的所有值。

因此,通过将其卸载到内存映射设备上。我们有

  • 将 C6713 从 ADC 操作中解放出来。 (释放了大量的计算能力)
  • 只有通过内存读取操作,C6713 才会有一个新值。

因此,现在要让您的 CPU 回读值,您可以在 CPU 上安排读取操作以确保它始终获得新值,或者您可以配置您的 FPGA,在这种特殊情况下,每 50 微秒产生一个中断,让您CPU 中断驱动。

所以简而言之,这还不错,因为您可以通过从 CPU 卸载此类任务并释放大量计算能力来获得很多收益。在此过程中,您还可以简化系统。

希望这会有所帮助。

【讨论】:

  • 是的,谢谢悉达多。我错过了 IO 设备通过一些中断线连接到 CPU 的观点。
  • 它们通常通过中断线连接到CPU。就像我在答案中提到的那样。我的应用程序中的 FPGA 有超过 4 条直接连接到 CPU 的中断线(在我的例子中是 C6713)。所以我可以优先考虑我想首先服务的中断。
  • 这实际上是一个非常健壮和灵活的设计。你应该进一步阅读这个。这些设计案例提供了非常有趣的案例研究,甚至可以帮助您在您的行业中调整产品中的某些标准设计。
  • 是的,这是一种非常有趣且更快的方式来完成 IO 操作。你有什么好的文档或什么我可以用来了解更多关于这个设计的信息吗?
猜你喜欢
  • 2011-04-22
  • 2012-03-28
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多