问题标签 [dma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
178 浏览

usb - 使端点数据缓冲区能够 DMA

我目前正在开发具有 SH_MOBILE 架构的定制硬件。硬件带有 USB(外设)和具有 2 个通道的 DMAC。我正在使用主线内核中可用的 R8a66597 UDC 驱动程序。我已将 DMA 相关功能添加到外围控制器驱动程序中。目前我能够让 DMA 在 TX 路径中工作。但在 RX 路径中,我无法使用 DMA,而是使用 PIO。这是因为缓冲区地址(struct usb_request 中的 buf)不是 8 位对齐的。我想知道如何确保这些数据传输缓冲区支持 DMA?

在此先感谢,斯里尼迪 KV

0 投票
1 回答
1113 浏览

memory - 如何在带有 32b PCI 设备的 x86_64 系统上使用 DMA 内存

在具有 32 位设备(例如旧 NIC)的 x86_64 系统上:在 NIC 和 DRAM 之间进行 DMA 时,内存地址是否必须在较低的内存中(低于 4GB)?

顺便问一下,OS如何知道为PCI设备保留的内存地址空间资源,即BAR中存储的地址?

0 投票
1 回答
547 浏览

caching - 如何从固定(锁定页面)RAM 中读取,而不是从 CPU 缓存中读取(使用 DMA 零拷贝和 GPU)?

如果我在 CUDA C++ 上将 DMA 用于 RAM <-> GPU,我如何确定内存将从固定(锁定页面)RAM 中读取,而不是从 CPU 缓存中读取?

毕竟,使用 DMA,CPU 对有人更改内存以及需要同步 CPU(缓存<->RAM)这一事实一无所知。据我所知,来自 C++11 的 std :: memory_barier () 对 DMA 没有帮助,也不会从 RAM 中读取,而只会导致缓存 L1/L2/L3 之间的一致性。此外,一般来说,CPU上的缓存和RAM之间没有解决冲突的协议,而只是在NUMA中同步不同级别的CPU缓存L1/L2/L3和多CPU的协议:MOESI / MESIF

0 投票
2 回答
51 浏览

low-level - 为什么大多数机器不能处理单个位?

我正在阅读有关位数组的信息,我想到了这个问题。为什么大多数机器不能处理单个位?是因为 DMA 还是因为为每个位保留地址太昂贵(内存/电路)?

0 投票
1 回答
623 浏览

linux - 无法在 2 个 TSI148 VMEbus 控制器之间设置可靠的 DMA 传输

我正在寻求帮助,最重要的是来自 VMEbus 专家。

我正在开展一个项目,旨在设置从运行 vxWorks 6.8 的实时 powerpc 控制器 (Emerson MVME4100) 到运行带有内核 2.6.32 的 Debian 6 的 Linux Intel 计算机 (Xembedded XVME6300) 的通信通道。该通道运行在 VME 总线上;两台计算机都在 VME 机箱中,并且都使用 Tundra Tsi148 芯片组。英特尔计算机被明确配置为系统控制器,而实​​时计算机则明确没有。

设置:对于 Intel 计算机,我编写了一个自定义驱动程序,该驱动程序创建了一个 4MB 内核缓冲区,并通过从属窗口在 VME 总线上共享它;对于实时计算机,我设置了一个 DMA 传输来重复转发正好 48640 字节的块;快速连续填充测试数据字节(零、一、二等)(如果可能,每 32 毫秒一次) 对于英特尔计算机,我从驱动程序读取内核缓冲区,以查看数据是否正确到达一个手动启动的 Python 程序。

期望:我期望从 Python 程序中看到相同的数据(零、一等)。我预计传输时间大致对应于所选的总线速度(通常为 290 us 或 145 us,具体取决于总线速度),加上合理的 DMA 设置开销(高达 10us?我愿意接受更大的数字,比如数百个微秒,如果这是公共汽车通常需要的)

结果:

  • 有时数据根本没有到达,“传输”时间约为 2000 us
  • 有时数据可靠地到达,但传输时间约为 98270us 或 98470us,具体取决于所选的总线速度。

问题:我怎样才能使传输可靠并降低这些可怕的延迟?接下来我应该搜索什么大方向?

(如果可以的话,我想用 VMEbus 标记)

非常感谢

0 投票
1 回答
1058 浏览

linux - 为什么我在 Linux 中将 kmalloc 与 GFP_DMA 一起使用时会得到一个高地址?

我正在为 Linux 中的 DMA 设备编写设备驱动程序。在Linux 设备驱动程序第 15 章中,它说:

对于具有这种限制的设备,应通过将 GFP_DMA 标志添加到 kmalloc 或 get_free_pages 调用来从 DMA 区域分配内存。当此标志存在时,仅分配可以用 24 位寻址的内存。或者,您可以使用通用 DMA 层(我们稍后会讨论)来分配缓冲区以解决您设备的限制

我这样打电话kmalloc

并打印这样的结果:

这就是我所看到的:

如果我使用 GFP_DMA,如何获得0xffff880000180000不适合 24 位的指针?

难道这不是我的内存块的物理地址?如果不是(这意味着我完全误解kmalloc了),我怎样才能得到它的物理地址?


我在 OpenSuse 12 中工作。

0 投票
0 回答
1213 浏览

linux - 为 Linux 2.6.30 DMA API 映射设备内存

我一直在努力解决这个问题,非常感谢一些帮助。我想使用 At91sam9g45 的内部 SRAM(垫脚石 - 启动后不使用)来加快一些密集计算,但无法满足以下所有条件:

  1. 内存可以从用户空间访问。这很容易使用 user spacemmap()然后 kernel remap_pfn_range()。使用返回的指针,我的用户空间程序可以读取/写入 SRAM。

  2. 使用内核 DMA API 调用dma_async_memcpy_buf_to_buf()使用 DMA 执行 memcpy。在我的基本驱动程序中,我想调用此操作将数据从 DDR(使用 kmalloc() 分配)复制到 SRAM 缓冲区中。

所以我的问题是我有用户空间和物理地址,但没有内核空间 DMA API 友好映射。

我尝试使用 ioremap 并使用提供给iotable_init(). 这些似乎都不会导致内核虚拟地址可以与类似的东西一起使用virt_to_bus(它适用于 kmalloc 地址,我认为在 DMA API 中使用)。

有办法,这只是使用物理地址手动触发 DMA,但我想尝试解决这个问题。我一直在阅读 LDD3 和谷歌搜索,但我看不到任何将非 kmalloc 内存用于 DMA API 的示例(PCI 总线除外)。

0 投票
1 回答
1473 浏览

linux - 具有 DMA 功能的 PCI/PCIe 卡,用于设备驱动程序培训

我试图为带有 PCI/PCIe 设备的设备驱动程序学习 DMA,我的平台是 linux/bsd。我发现了很多用于训练的简单 PCI 板(例如简单的数字 I/O 板),但没有一个硬件复杂到足以处理 DMA。Stackoverflow 上是否有人知道带有某种微处理器或微控制器的 PCI/PCIe 卡,我可以使用 gcc 等开源工具(例如 PowerPC、68HC11、Atmel、8051 等)进行编程?

当然,踢球者的成本很低……如果可能的话,低于 300.00 美元。

我不想要基于 FPGA 的板,因为这需要 Windows 工作站(通常)来对 FPGA 进行编程,以及在 FPGA 中创建和使用 PCI/PCIe IP 内核所需的所有时间。基本上,我不想把时间花在 FPGA 上;我想在设备驱动程序上工作!虽然这可能是我唯一的选择......

0 投票
2 回答
4273 浏览

c - UART DMA Tx/Rx 架构

可能重复:
UART ISR Tx Rx 架构

我现在正在使用 TI micro,它包括一个 DMA UART 驱动程序和一个支持并行任务的操作系统。UART驱动的功能包括:

  • 静态无效 HalUARTInitDMA(void);
  • 静态无效 HalUARTOpenDMA(halUARTCfg_t *config);
  • 静态 uint16 HalUARTReadDMA(uint8 *buf, uint16 len);
  • 静态 uint16 HalUARTWriteDMA(uint8 *buf, uint16 len);
  • 静态无效 HalUARTPollDMA(void);
  • 静态 uint16 HalUARTRxAvailDMA(void);
  • 静态无效 HalUARTSuspendDMA(void);
  • 静态无效 HalUARTResumeDMA(void);

我正在尝试与另一个外围设备通信,该外围设备接受以回车符终止的消息,然后以回车符响应消息。

我很好奇构建这种类型的通信状态机的最佳方法是什么。我的问题是为 UART 端口设计回调函数,使其...

  1. 不会挂起系统等待响应。(某种超时)
  2. 如果响应被读取得太快,它会将响应连接在一起
  3. 回车将表示消息的结束

基本理论是这样的:

这个想法有几个明显的缺陷。我希望有人可以就如何进行这种类型的交流分享一些想法?

谢谢!

0 投票
1 回答
678 浏览

arm - 在 OMAP 4460 上进行多个 DMA 传输时 CPU 是否被阻塞?

我想知道 DMA 在 Pandaboard 中的工作原理。我已经阅读了 Pandaboard 中使用的 OMPA4460 的 TRM,DMA 系统一次可以管理总共 128 个请求,最多 32 个逻辑通道和 4 个中断请求。当 DMA 正在进行时,CPU 是否有机会一次执行另一个任务?